MYSQL,无法比较(均衡)两个值



我认为我的问题很奇怪。我正在尝试使用以下 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导入脚本要好:)谢谢

相关内容

  • 没有找到相关文章

最新更新