【问题标题】:MySQL field changed from VARCHAR(20) to INT after LOAD DATA LOCAL INFILEMySQL 字段在 LOAD DATA LOCAL INFILE 后从 VARCHAR(20) 更改为 INT
【发布时间】: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' 字符。

标签: c# mysql csv


【解决方案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 

【讨论】:

  • 谢谢,你救了我的命。 '\r\n' 是问题所在。
  • 如果这回答了所提出的问题,请考虑“接受”这个答案。
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2020-07-25
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多