在LOAD DATA LOCAL INFILE之后,MySQL字段从VARCHAR(20)更改为INT

时间:2016-09-12 01:10:30

标签: c# mysql csv

从本地加载.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;

我尝试了特定的字段,但仍然无法正常工作。

1 个答案:

答案 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