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

时间:2015-01-28 00:26:16

标签: php mysql compare

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

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

它返回一个空值,我确定代码是正确的,因为它适用于其他表。我注意到,如果我去桌面,删除id值,然后再次手动输入,它可以正常工作(即使其余值看起来相同)。我的表格是从csv文件中导入的,但我确定我在行尾没有任何空格/字母/错误的字符等(甚至用HexEdit检查过)。例如,如果我使用:

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

然后它起作用,所以看起来id值的某种方式出现了问题。我也试图改变字符集。

2 个答案:

答案 0 :(得分:1)

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

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

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('roman\r') 

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

要从id列(而不仅仅是尾随列)中删除所有出现的回车符,您可以使用REPLACE功能。

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

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

在UPDATE语句中,例如

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

如果id是.csv文件中的最后一个字段,那么该文件的行可能会以DOS样式结束,并带有回车符和换行符;并且读取输入文件的过程仅从换行符中删除,并将回车符保留为数据的一部分。

答案 1 :(得分:0)

看起来这是由csv导入引起的,上一列中的所有值都有一个额外的换行符号。我尝试过以下代码:

SELECT name FROM table WHERE id LIKE&#39; roman _ &#39;分组name

所以它会&#34;跳过&#34;最后一个字符,仍然没有选择我的其他值,如:roman_string roman_string2等。也许它不是最好的解决方案,但它比花费大量时间重建csv导入脚本更好:)谢谢