从本地加载.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;
我尝试了特定的字段,但仍然无法正常工作。
答案 0 :(得分:1)
如果它是MS-DOS格式的csv文件,则行终止符可能包含回车符。行终止符可能是'\r\n'
。
指定LINES TERMINATED BY '\n'
时,'\r'
字符将包含在最后一个字段中。
查看存储内容与文字之间差异的一种方法是使用HEX功能。像这样:
SELECT HEX(q.po) AS hex_po_col
, HEX('240000388') AS hex_literal
FROM len_enq_spph q
WHERE q.po = 240000388
与整数"的比较起作用"匹配该行,因为MySQL正在将po
列隐式转换为数字。 MySQL通过逐个字符地读取它,直到它遇到使字符串不形成有效数字的字符。
另一项测试:
SELECT HEX(q.po) AS hex_po_col
FROM len_enq_spph q
WHERE q.po = '240000388\r'
它也可能是一个不同的,或者另外的隐藏的"加载到列中的字符。
SELECT HEX(q.po) AS hex_po_col
FROM len_enq_spph q
WHERE q.po LIKE '240000388%'
如果您只想存储数值的有效表示,可以更改LOAD DATA语句以将字段加载到中间用户定义的变量中,然后使用带有表达式的SET子句转换为数字,清理它。
我只是根据csv文件的第一行猜测表中的其他列名...
LOAD DATA LOCAL INFILE 'c:/temp/SPPH.csv'
INTO TABLE len_enq_spph
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
( `id`
, `order_id`
, `ext_ord_ref`
, @order_id2_1
)
SET `po` = @order_id2_1 + 0