MySQL将错误的数据类型导入到VARCHAR列中
今天我做了一件蠢事:我在excel文件中有一个卡号列表,我必须以某种方式导入到DB表中。所以我将数字导出到CSV文件,但没有任何引号(不要问我为什么)。该文件看起来像:MySQL将错误的数据类型导入到VARCHAR列中,mysql,database,csv,sqldatatypes,Mysql,Database,Csv,Sqldatatypes,今天我做了一件蠢事:我在excel文件中有一个卡号列表,我必须以某种方式导入到DB表中。所以我将数字导出到CSV文件,但没有任何引号(不要问我为什么)。该文件看起来像: 123456 234567 345678 ... 然后我用一个VARCHAR(22)列创建了一个表,并做了一个 LOAD DATA LOCAL INFILE 'numbers.csv' INTO TABLE cards 除了许多我忽略的警告(我做的另一件蠢事)之外,这一切都很好。 之后,我尝试使用以下SQL进行查询: SEL
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 cards SET number = CAST(number AS CHAR(22))
但那没用
那么,有没有办法解决这个问题,这是怎么发生的呢?这是为了进行数值比较而进行的一些隐式转换的结果:
SELECT * FROM cards WHERE number='123'
这将仅与字面上为“123”
的文本字段匹配,如果您有这些字段,则将错过“123”
和“123\r”
。出于某种原因,“123”
和“123”
被认为与两侧的尾部空间删除“等效”
导入时,不要忘记以“\r\n”结尾的行。
。如果您对字段中的内容(包括隐藏字符)感到困惑,请尝试:
SELECT HEX(number) FROM cards
这将显示每个字符串的十六进制转储输出。像20
这样的东西表示空格,就像URL中的%20
是空格一样
您还可以通过以下方式解决此问题:
UPDATE cards SET number=REPLACE(number, '\r', '')
你在你的领域有可能有空间吗?据我所知,在进行数字转换时,这些将被剥离。如果它是VARCHAR
列,它将只包含字符数据,而不包含整数,但在进行过滤时可能会进行一些隐式转换。SHOW创建表卡时显示了什么?我在导出数据后发现了真正的情况。每个值后面都有一个隐藏的\r
!但这仍然很奇怪,为什么查询没有引号。这是因为隐式转换。它导致对值进行强制转换以进行数字比较。您应该添加关于如何解决此问题的答案。导入时,不要忘记以“\r\n”结尾的行。
。如果您对字段中的内容(包括隐藏字符)感到困惑,请尝试从卡片中选择十六进制(数字)
。这很有意义。因此,在转换之后,\r
被剥离,而如果我执行带引号的查询,它将尝试精确匹配,但失败。谢谢