mysql将LOX数字更改为LOAD DATA LOCAL INFILE中的十进制数

时间:2017-11-01 14:03:05

标签: mysql hex

全部 我有一个test.csv文件,其ID为十六进制数字,如下所示:

Id, DateTime,...
66031851, ...
2E337E4E, ...

table_test是使用MYSQL创建的,如下所示:

CREATE TABLE table_test(
    Id BIGINT NOT NULL,
    DateTime DATETIME NOT NULL,
    OtherId BIGINT NOT NULL,
    ...,
    PRIMARY KEY (Id, DateTime, OtherId)
 )ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建的table_test如下:

+---------------------+--------------+------+-----+---------+-------+
| Field               | Type         | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| Id                  | bigint(20)   | NO   | PRI | NULL    |       |
| DateTime            | datetime     | NO   | PRI | NULL    |       |

我正在使用如下的MYSQL来加载表中的数据:

load data local infile 'test.csv' replace into table table_test character set utf8mb4 fields terminated by ',' ENCLOSED BY '\"' lines terminated by '\n' ignore 1 lines SET Id=CONV(Id, 16, 10);

也尝试过:

SET Id=cast(CONV(Id, 16, 10) AS UNSIGNED)

SET Id=cast(CONV(CONVERT(Id,CHAR), 16, 10) AS UNSIGNED)

但十六进制数字的字母与" 2E337E4E"不工作。它们变成了一个比BIGINT更大的数字。但是当我在下面尝试MYSQL时:

select CONV('2E337E4E', 16, 10); 

按预期正常结果" 775126606"。所以我想我错过了一个步骤" LOAD DATA"将Id作为CONV()的字符串。搜索了一段时间,但没有找到解决方案。 任何人都有一些想法或提示?

非常感谢

志宏

1 个答案:

答案 0 :(得分:1)

此类问题的典型解决方案是将值加载到用户定义的变量中,然后在SET语句中进行转换。

这样的事情对你有用:

load data local infile 'test.csv' 
replace into table table_test 
character set utf8mb4 
fields terminated by ',' 
ENCLOSED BY '\"' 
lines terminated by '\n' 
ignore 1 lines 
(@Id, `DateTime`, <explicitly list all other columns>)
SET Id=CONV(@Id, 16, 10);