【问题标题】:MYSQL, can't compare(equalize) two valuesMYSQL,无法比较(均衡)两个值
【发布时间】:2015-01-28 00:26:15
【问题描述】:

我觉得我的问题很奇怪。我正在尝试使用以下 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 值似乎有问题。我也尝试过更改字符集。

【问题讨论】:

  • 你能显示SELECT id, name WHERE 'id' LIKE 'roman%' GROUP by 'name' 的输出吗?你的FROM table_name 在哪里? :-)
  • 关于 FROM,忘了写在这里,但它在代码中 :) 我不能使用 LIKE,因为我有一些其他类似的 id,roman_tech,roman_skills 等
  • 绝对确定,字段的长度是否正确? IE。这是否返回一列值5select length(id) from ... where id like 'roman%';
  • 您可以重置表中的值吗?只是将roman 复制到表格中?我很确定隐藏的特殊字符有一些错误的值,所以尝试放置一个好的并再次查询
  • 看起来十六进制返回 6 个值而不是 5 726F6D616E 和 726F6D616E0D

标签: php mysql compare


【解决方案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 样式结尾的行,带有回车和换行;并且读取输入文件的进程只去除了换行符,并将回车作为数据的一部分。

【讨论】:

    【解决方案2】:

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

    SELECT name FROM table WHERE id LIKE 'roman_' GROUP by name

    所以它会“跳过”最后一个字符并且仍然不选择我的其他值,例如:roman_string roman_string2 等。也许这不是最好的解决方案,但它比花费大量时间重建 csv 导入脚本要好:) 谢谢

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 2013-10-28
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多