【发布时间】:2016-09-12 01:10:30
【问题描述】:
从本地加载 .csv 文件时遇到问题。我的字段已自行从 VARCHAR(20) 更改为 INT。我知道使用这种语法后(这就是我想要的):
SELECT * FROM `len_enq_spph` WHERE po = '240000388';
返回 null
但如果我使用这种语法:
SELECT * FROM `len_enq_spph` WHERE po = 240000388;
它返回我想要的。
po 字段是 VARCHAR(20)。 但是为什么该字段必须在 where 子句中使用 INT 呢? 我的 csv 文件的这个例子
id|order_id|ext_ord_ref|order_id2__1
1|160000402|110005678|240000388
2|160000402|110005678|240000388
3|160000402|110005678|240000388
这是我的 LOAD 语法:
LOAD DATA LOCAL INFILE 'c:\\temp\\SPPH.csv' INTO TABLE len_enq_spph
FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' IGNORE 1 LINES;
我尝试了特定字段,但仍然无法正常工作。
【问题讨论】:
-
没有。 LOAD DATA 不会将
po列的定义从 VARCHAR(20) 更改为 INT。为什么一个查询返回行,而另一个不返回?这是因为在返回行的查询中,WHERE 子句中的条件导致po隐式转换为数字,以便与数字文字进行比较。使用字符文字(在单引号中)不会发生转换,并且仅当存储在po中的字符串等于字符串文字时,才会满足条件。我敢打赌,po列值的末尾有一个隐藏的'\r'字符。