varchar类型竟然不区分大小写

今天线上出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'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值