我要将十亿行加载到mySQL表中,其中一列--BINARY(20) - 是其他几列的SHA1哈希值,连接起来。我不知道如何使用LOAD命令加载二进制值,因为它似乎依赖于分隔符。
显然,速度在这里很重要,这就是我想使用LOAD的原因。有谁知道如何用LOAD加载固定长度的二进制值?这可能是触发器的工作吗? (我之前从未使用过触发器。)或者我可以在LOAD命令中调用一个函数(例如UNHEX)吗?
(因为它似乎是一个常见的问题:不,我不想将它存储在base64或hex表示法中.BINARY(20)是一个要求。)
答案 0 :(得分:0)
二进制数据和LOAD DATA INFILE
不是朋友。文件格式说明符需要一个分隔符,任意二进制数据的长度分隔,而不是字段分隔。
您最好的选择是使用大型多INSERT
语句并强制执行。这些可以处理十六进制编码的字符串被解码并自动放入BINARY
列。
如果你真的需要加载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);