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

标签 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

注意缺少的引号!看来,我设法用 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/

相关文章:

PHP 将数组值插入 MySQL 准备语句

php - 在新查询中链接现有 MySQL 记录,PHP/PDO

perl - 使用 Perl 解析 CSV 文件从特定行到文件末尾

java - 更简单的 CSV 到 SQL java 文件转换器

mysql - 如何在 MYSQL 数据库表的列中仅插入 Null 集的值

python - (Python) 如何编辑 SQL 数据库中的现有行?

database - 跟踪用户最近事件的策略

mysql 根据销售价格进行条件选择

database - PostgreSQL:无法打开文件进行读取。没有权限。 SQL 状态:42501

Python 程序在 shell 中工作,但从 IDLE 运行时不工作