mysql 查询不区分大小写问题

Scroll Down

最近执行一个SQL时候,发现居然不区分大小写。会想起mysql大小写相关的支持点想起了mysql的collation。
collation 不同

  1. 会影响到where条件中大于小于号筛选出来的结果,
  2. 会影响到order by语句的顺序
  3. 会影响distinct、group by、having语句的查询结果。
  4. 会影响索引创建(索引列是字符类型)
    总之,凡是涉及到字符类型比较或排序的地方,都和collation有关。
问题点

mysql字符检索策略
utf8_general_ci,不区分大小写; (性能最好)
utf8_general_cs表示区分大小写;(性能次之)
utf8_bin表示二进制比较,同样也区分大小写(性能最慢)

解决方法
  1. 设计表时,直接设置表的collate属性为utf8_general_cs或者utf8_bin(修改表默认collation)
  2. 直接在sql语句前加上binary关键字即可
select * from t_order where order_no = binary('PAX123123');
select * from t_order where binary order_no = 'PAX123123';
select * from t_order where binary order_no = 'PAX123123' and agent_order_id = 'pax123123'; 
(只支持binary后第一个查询条件,agent_order_id不区分大小写)

查询mysql支持的collation

show collation;

查看服务器级校验规则

show variables like 'collation_server';

查看数据库级校验规则

show variables like 'collation_database';

附官方文档
[https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html](xxx_general_ci 与 xxx_unicode_ci区别)