今天我做了一件愚蠢的事情:我在 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
注意缺少的引号!看来,我设法用 INTEGER
数据填充我的 VARCHAR
表。我根本不知道这怎么可能。
我已经尝试使用这样的 UPDATE
来修复此问题
UPDATE cards SET number = CAST(number AS CHAR(22))
但这没有用。
那么有没有办法解决这个问题,这种情况怎么会发生呢?
最佳答案
这是为了进行数值比较而进行的一些隐式转换的结果:
SELECT * FROM cards WHERE number='123'
这只会匹配字面意思为 "123"
的文本字段,并且会错过 "123"
和 "123\r"
如果你有那些。由于某种原因,“123”
和 “123”
被认为“等效”,大概与两侧的尾随空格删除相同。
进行导入时,不要忘记LINES TERMINATED BY '\r\n'
。如果您对字段中的内容(包括隐藏字符)感到困惑,请尝试:
SELECT HEX(number) FROM cards
这将显示每个字符串的十六进制转储输出。像 20
这样的东西表示空格,就像 URL 中的 %20
是空格一样。
您还可以通过以下方式解决此问题:
UPDATE cards SET number=REPLACE(number, '\r', '')
关于MySQL 将错误的数据类型导入 VARCHAR 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951984/