我有一个表,其中包含 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;
然后运行相同的查询,然后该行将按预期返回。所以,此时我有两个问题:
如何防止 csv 上传不被识别为字符串的值?
如何批量更新 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/