为varchar列加载csv文件到MySQL中,但仍然以数字数据类型加载



我尝试加载邮政编码的CSV文件,该文件应该在MySQL中存储为VARCHAR(10)。表定义如下:

Create TABLE PostalCode (postal_code VARCHAR (10) NOT NULL);

加载方式如下:

LOAD DATA LOCAL INFILE 'path/postal_code.csv' 
INTO TABLE PostalCode
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY 'n'
IGNORE 1 ROWS
(@postal_code)
postal_code = CAST(@postal_code AS CHAR(10));

假设有一个邮政编码1000。现在调用sqlSELECT * FROM PostalCode WHERE postal_code = '1000'会得到一个空结果。同时,SELECT * FROM PostalCode WHERE postal_code = 1000确实给出了行,这不是我所期望的。这意味着posta_code列被读取为一个数字列…

注意,DESCRIBE PostalCode确实显示postal_code列是一个VARCHAR(10)。

有谁知道根本原因和/或解决方案吗?

注。如果在加载代码中不使用强制转换,问题仍然存在:

LOAD DATA LOCAL INFILE 'path/postal_code.csv' 
INTO TABLE PostalCode
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY 'n'
IGNORE 1 ROWS
(postal_code);

更新:

可以不将值存储为数字。它可能仍然存储为VARCHAR(10),因为SELECT * FROM PostalCode WHERE postal_code LIKE '1000%'仍然给我想要的行。但是为什么会有尾随字符呢?似乎尾随字符甚至不是空格,因为使用TRIM函数没有帮助..

问题解决了。结果是,该csv文件中的每一行都使用'r'而不是'n'结束。因此,通过将sql更改为

,可以修复此问题。
LOAD DATA LOCAL INFILE 'path/postal_code.csv' 
INTO TABLE PostalCode
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY 'rn'
IGNORE 1 ROWS
(@postal_code)
postal_code = CAST(@postal_code AS CHAR(10));

教训:要小心你的csv行终止字符,特别是当csv来自外部源

最新更新