我有一个包含varchar(50)列= 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;
然后运行相同的查询,然后按预期返回行。因此,在此,我有两个问题:
发布于 2016-03-11 15:18:30
如果.csv文件来自Windows,则该文件可以使用CRLF作为行分隔符。
如果加载数据指定了LINES TERMINATED BY '\n'
,那么您可能会将CR字符作为最后一列的一部分。
这也有可能是你捡到了后面的空间。
那只是猜测而已。
如果是这样的话,您可能需要您的加载数据来指定CRLF作为行终止符,并且您还可能希望通过一个TRIM函数运行最后一个字段。
我从Windows上创建的.csv文件中加载的数据如下所示(摘录,不完整):
LOAD DATA ...
...
LINES TERMINATED BY '\r\n'
...
( id
, @fld2
)
SET columnName = TRIM(@fld2)
要从负载中调试当前存储在列中的内容,可以使用HEX
函数。(这是我在MySQL中发现的最接近甲骨文风格的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','')
发布于 2016-03-11 15:03:23
我同意@bitfiddler的观点,你的数据似乎包含空格或不可打印的字符。如果无法清除添加的数据,则执行
UPDATE myDB.tableName SET columnName=TRIM(columnName)
将对现有数据进行大容量更新,但如果数据集很大,则可能需要一段时间。
https://stackoverflow.com/questions/35951305
复制相似问题