我正在尝试使用字母数字“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
整理后,一切都按预期工作。
答案 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