今天我做了一些愚蠢的事情:我在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))
但那没用。
有没有办法解决这个问题,这怎么可能发生呢?
答案 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', '')