现象
在使用MySQL字符串查询的时候遇到这么一个问题,查询没有区分大小写,如下图所示
查询name的时候,使用A去查询或者使用a去查询,结果是一样的。
限定讨论范围
- 仅讨论表的创建;
- 仅讨论表中列值的大小写查询问题;
- 仅讨论字符集编码utf8,排序规则utf8_general_ci,utf8_bin;
原因
MySQL字符集与排序规则
首先要说到MySQL的字符集与排序规则,在创建一张表时,可以指定表的字符集与排序规则,也可以指定列的字符集排序规则。(本文不讨论数据库各个级别配置对列的字符集和排序规则的影响)。影响查询结果的是该列的排序规则,如上文中中展示的查询结果,name字段设置的排序规则就是utf8_general_ci。如果通过命令修改name列的排序规则为utf8_bin,则查询时候能够区分大小写,如下图所示。
在确定了字符集后,影响查询是否支持大小写的是列的排序规则。
总结
字符集是一套符号和编码,而排序规则则是在字符集内用于比较字符的一套规则。仅针对使用MySQL中utf8的的字符集,将英文字母“A”与“a”编码存入磁盘,所以读取出来的数据是区分大小写的。但是在查询的时候,从磁盘中获取utf8解码后的字符,再通过排序规则来比较,如果使用的是utf8_general_ci,则查询过程中不区分大小写,如果使用的是utf8_bin,则查询过程区分大小写。