首页 > 解决方案 > MySQL“LOAD DATA INFILE”查询,“TERMINATED BY”问题

问题描述

我有一个hashes有 2 列的表,hash | plain

和一个看起来像这样的文本文件:

acbd18db4cc2f85cedef654fccc4a4d8:foo
37b51d194a7513e45b56f6524f2d51f2:bar
4e99e8c12de7e01535248d2bac85e732:foo:bar

我正在尝试执行此查询:

LOAD DATA LOCAL INFILE 'file.txt' INTO TABLE hashes COLUMNS TERMINATED BY ':' LINES TERMINATED BY '\n'

问题是,对于散列4e99e8c12de7e01535248d2bac85e732,它只会插入foo,而不是foo:bar,因为COLUMNS TERMINATED BY ':'.

我怎样才能让它“只分裂一次”来解决这个问题?

标签: mysql

解决方案


您可以加载到用户变量中并使用一些字符串操作。

drop table if exists t;
create table t
(hash varchar(100),plain varchar(100));

LOAD DATA INFILE 'file.txt' 
INTO TABLE t 
LINES TERMINATED BY '\r\n'
(@var)
set   
        hash = substring_index(@var,':',1),
        plain = replace(@var,substring_index(@var,':',1),'')
;


select * 
from t;

+--------+----------+
| hash   | plain    |
+--------+----------+
| abc    | :def     |
| abc    | :ghi     |
| abc    | :def:ghi |
+--------+----------+
3 rows in set (0.001 sec)

注意我已经使用 \r\n 来正确加载它 - 你应该测试你的环境


推荐阅读