Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL将错误的数据类型导入到VARCHAR列中_Mysql_Database_Csv_Sqldatatypes - Fatal编程技术网

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

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

今天我做了一件蠢事:我在excel文件中有一个卡号列表,我必须以某种方式导入到DB表中。所以我将数字导出到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 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
被剥离,而如果我执行带引号的查询,它将尝试精确匹配,但失败。谢谢