我尝试加载邮政编码的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来自外部源