MYSQL,无法比较(等于)两个值

MYSQL, can't compare(equalize) two values

我觉得我的问题很奇怪。我正在尝试使用以下 sql 代码:

SELECT `name` FROM `table` WHERE `id` = 'roman' GROUP by `name`

它 returns 我是一个空值,我确信代码是正确的,因为它可以与其他 table 一起使用。我注意到,如果我转到 table,删除 id 值,然后再次手动输入它,它就可以正常工作(即使其余值看起来相同)。我的 table 是从 csv 文件导入的,但我确定行尾没有任何 spaces/letters/wrong 字符等(甚至用 HexEdit 进行了检查)。例如,如果我使用:

SELECT `name` FROM `table` WHERE `id` LIKE 'roman%' GROUP by `name`

然后它起作用了,所以看起来 id 值不知何故有问题。我也尝试过更改字符集。

最可能的解释是列中存储了不可打印的字符,可能是回车符 return、制表符或换行符。

要找出答案,请尝试获取存储值的十六进制表示和字节长度。

SELECT HEX('roman')
     , LENGTH('roman')
     , HEX(t.id)
     , LENGTH(t.id)
  FROM mytable t
 WHERE t.id <> 'roman'
   AND t.id LIKE 'roman%'

(可能正在进行字符集转换。上面的相同查询将揭示一些细节。)


存储的值末尾有一个回车return字符,十进制值为13。比较对象:

SELECT HEX('roman\r') 

HEX('roman\r')  
----------------
726F6D616E0D
          ^^

要从 id 列中删除所有出现的 return 字符(不仅仅是尾随字符),您可以使用 REPLACE 函数。

SELECT HEX(REPLACE('ro\rman\r','\r',''))

HEX(REPLACE('ro\rman\r','\r',''))  
-----------------------------------
726F6D616E

在更新语句中,例如

UPDATE mytable SET id = REPLACE(id,'\r','')

如果 id 是 .csv 文件中的最后一个字段,则文件的行结束可能是 DOS 样式,带有回车符 return 和换行符;并且读取输入文件的过程仅剥离换行符,并将回车return作为数据的一部分。

这似乎是由 csv 导入引起的,最后一列中的所有值都有一个额外的换行符。我试过以下代码:

SELECT name 来自 table WHERE id LIKE 'roman_' GROUP by name

所以它将 "skip" 最后一个字符,但仍然不是 select 我的其他值,如: roman_string roman_string2 等。也许这不是最好的解决方案,但它是比花费大量时间重建 csv 导入脚本更好 :) 谢谢