mysql查询无法识别字符串

时间:2016-03-11 22:48:52

标签: mysql sql csv

我有一个varchar(50)column = name的表。我从本地csv文件上传了值,使得表格如下所示。导入时没有错误/警告,我导入了相同格式的其他csv文件(Windows逗号分隔),没有出现此问题。

***************
ID * columnName
***************
1  * any
2  * thing
3  * helpful

当我跑步时:

SELECT * FROM myDB.tableName;

我看到如上所示的表格。但是,当我跑:

SELECT * FROM myDB.tableName WHERE columnName = "any";

我没有返回任何行。如果我然后通过以下方式覆盖表中的csv加载值:

UPDATE myDB.tableName SET columnName='any' WHERE ID= 1;

然后运行相同的查询,然后按预期返回该行。所以,在这一点上,我有两个问题:

  1. 如何阻止csv上传未被识别为字符串的值?

  2. 如何批量更新columnName中所有当前加载的值,以便将其识别为字符串(我无法进行单独更新,如上所示,因为受影响的行太多了?)

2 个答案:

答案 0 :(得分:1)

如果.csv文件来自Windows,则该文件可能使用CRLF作为行分隔符。

如果LOAD DATA指定LINES TERMINATED BY '\n',您可能会将CR字符作为最后一列的一部分。

你也可能正在拾取尾随空格。

这真的只是猜测。

如果是这种情况,您可能需要使用LOAD DATA将CRLF指定为行终止符,并且您可能还希望通过TRIM函数运行该最后一个字段。

我在Windows上创建的.csv文件的LOAD DATA看起来像这样(摘录,不完整):

LOAD DATA ...
... 
LINES TERMINATED BY '\r\n'
...
( id
, @fld2
)
SET columnName = TRIM(@fld2)

要从加载中调试当前存储在列中的内容,可以使用HEX函数。 (这是我在MySQL中发现的最接近Oracle风格的DUMP()函数。)

使用latin1字符集时,CR字符显示为x'0D'。空格为x'20',制表符为x'09'。

SELECT HEX('abc'), HEX('abc \t\r')

HEX('abc')   HEX('abc \t\r')  
----------   -----------------
61 62 63     61 62 63 20 09 0D

因此,要检查存储的内容,您可以运行以下内容:

SELECT columnName, HEX(columnName) 
  FROM mytable
 WHERE id = 1

基于此,您可以对LOAD DATA语句进行适当调整。

使用将字段加载到用户定义的变量的技术(如我的示例LOAD DATA中所示,将字段内容加载到@fld2,您可以使用SET子句来分配表达式表达式可以使用任意数量的内置MySQL函数。例如,从字符串中删除制表符

  SET columnName = REPLACE(@fld2,'\t','')

答案 1 :(得分:0)

我同意@bitfiddler看起来您的数据包含空白或不可打印的字符。如果在添加执行

时无法清理数据
UPDATE myDB.tableName SET columnName=TRIM(columnName) 

将对数据进行批量更新,但如果数据集很大,则可能需要一段时间。