今天线上出bug了,查询数据时竟然把名字大写的也查询出来了
查看一下student表的建表语句
SHOW CREATE TABLE student;
可以看到student_name字段为varchar类型
为什么MySQL查询的时候会不区分大小写呢?
其实这与表和字段的排序规则有关系,而排序规则又与字符集有关系
以MySQL 5.7.33版本为例,我们查看一下支持的字符集
show character set;
共支持41个字符集,再以我们比较熟悉的utf8mb4为例,默认排序规则是utf8mb4_general_ci
那么这个排序规则是什么意思呢?
general意思是普遍的、一般,说明这个通用的排序规则
ci为case insensitive的缩写,即大小写不敏感
所以这个排序规则就是不区分大小写的
那么utf8mb4共支持多少种排序规则?
有没有支持区分小大写的规则呢?
show collation where charset ='utf8mb4';
可以看到支持的26种排序规则中,除了utf8mb4_bin,其他的都是以ci结尾,那么我们就把student_name改为使用utf8mb4_bin这个排序规则再试试
成功啦~
解决方案有下面3种
1、修改字段支持大小写
ALTER TABLE student MODIFY student_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
2、修改整个表支持大小写
ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
3、使用binary函数
select * from student where name = binary 'zhangsan'