MySQL:将SHA1哈希加载到BINARY(20)列中

时间:2013-01-31 02:51:10

标签: mysql binary load sha1

我要将十亿行加载到mySQL表中,其中一列--BINARY(20) - 是其他几列的SHA1哈希值,连接起来。我不知道如何使用LOAD命令加载二进制值,因为它似乎依赖于分隔符。

显然,速度在这里很重要,这就是我想使用LOAD的原因。有谁知道如何用LOAD加载固定长度的二进制值?这可能是触发器的工作吗? (我之前从未使用过触发器。)或者我可以在LOAD命令中调用一个函数(例如UNHEX)吗?

(因为它似乎是一个常见的问题:不,我不想将它存储在base64或hex表示法中.BINARY(20)是一个要求。)

2 个答案:

答案 0 :(得分:0)

二进制数据和LOAD DATA INFILE不是朋友。文件格式说明符需要一个分隔符,任意二进制数据的长度分隔,而不是字段分隔。

您最好的选择是使用大型多INSERT语句并强制执行。这些可以处理十六进制编码的字符串被解码并自动放入BINARY列。

但是,我不确定为什么有人会希望自己有这种痛苦。与标准十六进制表示法相比,每行节省20个字节是不值得的。

如果你真的需要加载kajillions的行,那么MySQL可能不是最好的平台。您应该做的是将数据分片到多个表或数据库,或者使用NoSQL存储将其更有效地分割。

答案 1 :(得分:0)

这似乎是一种合理的方法:使用LOAD的SET形式,使用变量和调用UNHEX和CONCAT等函数。

例如:

假设mytable有四列:

mysha1  BINARY(20)
a       VARCHAR(20)
b       VARCHAR(20)
c       VARCHAR(20)

列mysha1是a,b和c的sha1哈希与'|'连接作为分隔符。

假设输入文件是三个字段的制表符分隔的文本行:

abel\tbaker\tcharlie\t\n
dog\teasy\tfor\t\n
etc\tetc\tetc\t\n

以下是我加载表的方法

LOAD DATA INFILE '/foo/bar/input.txt' INTO TABLE mytable 
FIELDS TERMINATED BY '\t' ESCAPED BY '\\' LINES TERMINATED BY '\n' 
(@f1, @f2, @f3) SET mysha1 = UNHEX(SHA1(CONCAT_WS('|', @f1, @f2, @f3))), 
a=@f1, b=@f2, c=@f3;

UPDATE :在一般情况下,对于使用内置函数(如SHA1)计算不能的任意二进制值,二进制值必须表示为INFILE作为可显示的十六进制字符串,读入@variable,然后使用UNHEX函数转换为二进制。 E.g:

mytable的:

mybin8    BINARY(8)
a         VARCHAR(20)
b         VARCHAR(20)
c         VARCHAR(20)

输入文件:

abel\tbaker\tcharlie\t0123456789abcdef\n
dog\teasy\tfox\t2468ace13579bdf\n
etc\tetc\tetc\t0000000000000000\n

加载命令:

LOAD DATA INFILE '/foo/bar/input.txt' INTO TABLE mytable 
FIELDS TERMINATED BY '\t' ESCAPED BY '\\' LINES TERMINATED BY '\n' 
(a, b, c, @myhex) SET mybin8 = UNHEX(@myhex);