MySQL将错误的数据类型导入VARCHAR列

时间:2013-07-30 16:04:20

标签: mysql database csv sqldatatypes

今天我做了一些愚蠢的事情:我在excel文件中有一个卡号列表,我必须以某种方式导入到数据库表中。所以我将数字导出到CSV文件,但没有任何引号(不要问我为什么)。该文件看起来像:

123456
234567
345678
...

然后我创建了一个包含单个VARCHAR(22)列的表并执行了

LOAD DATA LOCAL INFILE 'numbers.csv' INTO TABLE cards

除了许多警告之外,这个工作正常,我忽略了(我做的另一个愚蠢的事情)。 之后我尝试用这个SQL查询:

SELECT * FROM cards WHERE number='123456'

这给了我一个空洞的结果。虽然这有效:

SELECT * FROM cards WHERE number=123456

注意缺少的引号!所以看来,我设法使用VARCHAR数据填充我的INTEGER表格。我根本不知道这是怎么回事。

我已经尝试使用UPDATE这样的

解决此问题
UPDATE cards SET number = CAST(number AS CHAR(22))

但那没用。

有没有办法解决这个问题,这怎么可能发生呢?

1 个答案:

答案 0 :(得分:2)

这是一些隐式转换的结果,以便进行数值比较:

SELECT * FROM cards WHERE number='123'

这只会匹配"123"字面上的文字字段,如果您有" 123""123\r",则会遗漏。出于某种原因,"123 ""123"被认为是“等效的”,可能是双方的尾随空间移除。

进行导入时,请不要忘记LINES TERMINATED BY '\r\n'。如果您对某个字段中包含隐藏字符的内容感到困惑,请尝试:

SELECT HEX(number) FROM cards

这将显示每个字符串的十六进制转储输出。 20之类的内容表示空格,就像网址中的%20是空格一样。

您还可以通过以下方式解决此问题:

UPDATE cards SET number=REPLACE(number, '\r', '')