我认为我的问题很奇怪。我正在尝试使用以下 sql 代码:
SELECT `name` FROM `table` WHERE `id` = 'roman' GROUP by `name`
它向我返回一个 null 值,我确定代码是正确的,因为它适用于其他表。我注意到,如果我转到表,删除id
值,然后再次手动键入它,它工作得很好(即使其余值看起来相同)。我的表是从csv文件导入的,但我确定行尾没有任何空格/字母/错误的字符等(甚至使用HexEdit检查过)。例如,如果我使用:
SELECT `name` FROM `table` WHERE `id` LIKE 'roman%' GROUP by `name`
然后它工作,所以看起来 id 值以某种方式有问题。我也尝试更改字符集。
最可能的解释是列中存储了不可打印的字符,可能是回车符、制表符或换行符。
要找出答案,请尝试获取存储值的十六进制表示形式和字节长度。
SELECT HEX('roman')
, LENGTH('roman')
, HEX(t.id)
, LENGTH(t.id)
FROM mytable t
WHERE t.id <> 'roman'
AND t.id LIKE 'roman%'
(可能存在字符集转换。上面的相同查询将显示一些详细信息。
在存储的值的末尾有一个回车符,十进制值 13。 比较:
SELECT HEX('romanr')
HEX('romanr')
----------------
726F6D616E0D
^^
要从id
列中删除所有出现的回车符(而不仅仅是尾随字符),您可以使用 REPLACE
函数。
SELECT HEX(REPLACE('rormanr','r',''))
HEX(REPLACE('rormanr','r',''))
-----------------------------------
726F6D616E
在 UPDATE 语句中,例如
UPDATE mytable SET id = REPLACE(id,'r','')
如果id
是.csv文件中的最后一个字段,则该文件很可能具有以 DOS 结尾的行样式,带有回车符和换行符;读取输入文件的进程仅从换行符中删除,并将回车符作为数据的一部分保留。
看起来这是由 csv 导入引起的,最后一列中的所有值都有一个额外的换行符。我尝试了以下代码:
从table
中选择name
,其中id
像"ROMAN_"按name
分组
所以它会"跳过"最后一个字符,仍然不会选择我的其他值,例如:roman_string roman_string2等。也许这不是最好的解决方案,但它比花费大量时间重建csv导入脚本要好:)谢谢