目录
1、使用场景
2、实现过程及展示结果
2.1、修改字段排序规则为utf8_bin
2.2 把字段 强制转换校对设置为utf8_bin
3、总结
4、参考文章
1、使用场景
最近接手海外项目,其中有个bug,因为业务数据字段支持多种语言(法文、英文、俄罗斯语言)等。于是在输入模糊搜索法文字母的时候无法。最后查找原因,应该是字段创建默认数据库时候默认使用排序字符集是(utf8_general_ci):
- utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写;
- utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感,为utf8默认编码。
如果使用默认规则就不区分大小写,因为我在以前开发其他一个项目 用户名要求区分大小写的,遇见类似问题。所以定位此问题关键就是字段的排序规则问题。
2、实现过程及展示结果
因为此bug其他同事修改过,没有解决问题。于是我也网搜索相关文章解决方案。给出的方案见参考文章链接《关于mysql如何精准的查询法文字母》,结合文章方案我总结如下两种解决方式:
- 如果是做国际版业务,建议字段排序规则都选择 utf8_bin
- 在不修改现有数据库的情况下,最为简洁办法 把字段 强制转换校对设置为utf8_bin
- utf8mb4_unicode_ci 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
于是我分别试验以上两种方式:
2.1、修改字段排序规则为utf8_bin
此时执行查询如下代码所示:
SELECT * FROM cos_course c WHERE c.name like concat('%','é','%');
2.2 把字段 强制转换校对设置为utf8_bin
此时执行查询如下代码所示:
SELECT * FROM cos_course c WHERE c.name COLLATE utf8_bin like concat('%','é','%');
3、总结
此问题我的另外一个同事本来就修改过;但是没有找到问题的本质内容。实际上要么是字段变化为可以区分大小写两者比较,要么是数据库字段排序规则直接设置为区分大小写。