我有一个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;
然后运行相同的查询,然后按预期返回该行。所以,在这一点上,我有两个问题:
如何阻止csv上传未被识别为字符串的值?
如何批量更新columnName中所有当前加载的值,以便将其识别为字符串(我无法进行单独更新,如上所示,因为受影响的行太多了?)
答案 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)
将对数据进行批量更新,但如果数据集很大,则可能需要一段时间。