mysql查询无法识别字符串

标签 mysql sql csv

我有一个表,其中包含 varchar(50) 列 = 名称。我已经从本地 csv 文件上传了值,表格如下所示。导入时没有错误/警告,并且我导入了相同格式(Windows 逗号分隔)的其他 csv 文件,没有出现此问题。

***************
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 中当前加载的所有值以将其识别为字符串(我无法执行如上所示的单独更新,因为受影响的行太多)?

最佳答案

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

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

您也有可能拾取尾随空格。

这实际上只是一个猜测。

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

我在 Windows 上创建的 .csv 文件中的加载数据看起来像这样(摘录,不完整):

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','')

关于mysql查询无法识别字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951305/

相关文章:

mysql - 一个属性可以同时是pk和fk吗?

PHP 对象数组::不能使用 <MyObject> 类型的对象作为数组

python - 使用 python 将字典值写入 csv 中的单独列

mysql - 计算两个不同表的列之间的平均时间

csv - 如何更新 csv::ByteRecord 中的字段?

python - 使用 Python 的 csv.reader 处理转义引号

java - PHP - 记住来自 mysql 的 Dropdownlist 的选定值

mysql - 如何使用 ransack 在 Rails 5 中搜索 MySQL JSON 数组

SQL Server 2008 : DROP PROCEDURE error

sql - 我如何获得每个类别的前 n 条记录