使用=的MySQL不区分大小写的字符串匹配

时间:2011-10-10 05:13:57

标签: mysql collation

我正在尝试使用字母数字“short_code”列搜索记录。类似的东西:

SELECT * FROM items WHERE short_code = "1AV9"

如果没有排序规则并且列类型设置为varchar(),则此查询不区分大小写,因此它返回包含short_codes 1av9,1Av9等的记录。我不希望这样。

所以我尝试将short_code列的排序规则更改为utf8_bin,但现在查询根本没有返回任何内容。但是,如果我将查询更改为:

SELECT * FROM items WHERE short_code LIKE "1AV9%"

然后我得到了我想要的确切行。是否有可能通过转换我的列的排序规则,它在我所有短代码的末尾以某种方式附加了隐形字符?我该如何验证/修复此问题?

编辑:看起来通过将我的列类型更改为binary并尝试其他一些东西,它以某种方式填充所有带有空字节的short_codes,这解释了为什么查询不会不会返回任何结果。重新开始并设置utf8_bin整理后,一切都按预期工作。

3 个答案:

答案 0 :(得分:1)

这是一个疯狂的猜测。我认为该表并非原始的整理集。然后将整理设置为utf_bin,这会导致存储的字段长度混乱。

首先备份你的桌子。然后尝试:

ALTER TABLE items
  CHANGE COLUMN short_code short_code VARCHAR(48) 
    CHARACTER SET 'utf8' 
    COLLATE 'utf8_unicode_ci'  ;

添加一些字符(不在您的数据中):

UPDATE items 
SET short_code = CONCAT('++F++F', short_code, '++F++F') ;

删除它们:

UPDATE items 
SET short_code = REPLACE(short_code, '++F++F', '') ;

回到第8位:

ALTER TABLE items
  CHANGE COLUMN short_code short_code VARCHAR(8) ;

再次回到二进制排序规则:

ALTER TABLE items
  CHANGE COLUMN short_code short_code VARCHAR(8) 
    CHARACTER SET 'utf8' 
    COLLATE 'utf8_bin'  ;

也许这会修复不正确的长度。 (可能是一个较短的更改 - 从varchar到char再返回varchar - 将修复它。)

答案 1 :(得分:0)

尝试

SELECT LENGTH(short_code) FROM items WHERE short_code LIKE "1AV9%"

然后看看你是否得到了4以外的东西。


编辑:嗯,你的值可能有尾随空格。尝试

SELECT * FROM items WHERE short_code = "1AV9    "

(即1AV9加上四个空格)并查看是否有任何结果。

答案 2 :(得分:0)

如果您可以更改排序规则,请尝试“utf8_general_cs”。

或者

WHERE '1AV9' COLLATE utf8_general_cs = short_code