解决MySQL之中一个字段中无法精准的查询多语言语言字母的问题

目录

1、使用场景

2、实现过程及展示结果

2.1、修改字段排序规则为utf8_bin 

2.2 把字段 强制转换校对设置为utf8_bin 

3、总结

4、参考文章


1、使用场景

        最近接手海外项目,其中有个bug,因为业务数据字段支持多种语言(法文、英文、俄罗斯语言)等。于是在输入模糊搜索法文字母的时候无法。最后查找原因,应该是字段创建默认数据库时候默认使用排序字符集是(utf8_general_ci):

  1. utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写;
  2. 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、总结

        此问题我的另外一个同事本来就修改过;但是没有找到问题的本质内容。实际上要么是字段变化为可以区分大小写两者比较,要么是数据库字段排序规则直接设置为区分大小写。

4、参考文章

        mysql数据库编码格式utf8_general_ci、utf8_bin、utf8_general_cs

       utf8mb4的大小写敏感性测试及其修改方法

       关于mysql如何精准的查询法文字母

猜你喜欢

转载自blog.csdn.net/jianxia801/article/details/108463924