将csv文件加载到MySQL中,用于具有varchar的列,但仍加载为数值数据类型

cbjzeqam  于 2023-04-03  发布在  Mysql
关注(0)|答案(1)|浏览(114)

我尝试加载一个邮政编码的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));

假设有一个postal_code 1000。现在调用sql SELECT * FROM PostalCode WHERE postal_code = '1000'给出了一个空的结果。同时,SELECT * FROM PostalCode WHERE postal_code = 1000确实给出了行,这不是我所期望的。这意味着posta_code列被读取为数字列...
请注意,DESCRIBE PostalCode确实表明postal_code列是VARCHAR(10)。
有人知道根本原因和/或解决方案吗?
p.s.如果我没有在加载代码中使用强制转换,问题仍然存在:

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函数没有帮助。

sirbozc5

sirbozc51#

好了,问题解决了。原来csv文件中的每一行都是用'\r'而不是'\n'来终止的。所以可以通过将sql更改为

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

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

相关问题