0

今天我做了一些愚蠢的事情:我有一个 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))

但这没有用。

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

4

1 回答 1

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在 URL 中是空格一样。

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

UPDATE cards SET number=REPLACE(number, '\r', '')
于 2013-07-30T16:31:57.103 回答