MySQL字符串比较返回非精确匹配行的原因及精确匹配实现方法咨询
MySQL字符串比较返回非精确匹配行的原因及精确匹配实现方法咨询
嘿,我来帮你把这个问题理清楚哈!
为啥查询会返回两行?
这是因为你用的utf8_unicode_ci排序规则是不区分重音的(专业点说叫accent-insensitive)。在这个规则下,MySQL会把不带重音的uu和带重音的ùù判定为相等的字符串,所以你的WHERE条件会匹配到两行数据。
怎么实现精确匹配?
要只返回完全符合uu的行,你需要用区分重音且精确匹配的排序规则,这里有两种常用方法:
方法1:查询时临时指定精确排序规则
直接在查询里用utf8_bin(按字符二进制编码比较,完全精确)来做匹配:
SELECT *, 'explicit utf8_bin' used_collation FROM user_login WHERE login = _utf8'uu' COLLATE utf8_bin;
这样就只会返回id=1的那条记录啦,因为uu和ùù的二进制编码是不一样的。
方法2:修改列的默认排序规则(长期生效)
如果你的业务场景经常需要精确匹配,也可以直接修改表中login列的排序规则,以后查询就不用每次指定了:
-- 替换xx为你login列原本的长度,比如VARCHAR(50) ALTER TABLE user_login MODIFY COLUMN login VARCHAR(xx) CHARACTER SET utf8 COLLATE utf8_bin;
简单说下背后的逻辑:MySQL的排序规则(collation)直接决定了字符串比较的规则,_ci结尾的规则一般是不区分大小写+不区分重音,而_bin结尾的规则是严格按字符的二进制编码来对比,完全不会做等价转换。
备注:内容来源于stack exchange,提问作者Romeo Velloni
相关产品推荐
相关产品推荐

