记录一次由Mysql不区分大小写引发的bug

简述一下:
1)数据的code为:zztest;name为:测试。
2)所以缓存保留的key为zztest,数据为:测试。
3)查询时,以code为:zzTest进行查询,查询缓存失败,再去数据库查询,查询到一条数据,并保存到缓存中。
4)此时缓存中有两条数据:{zztest,测试};{zzTest,测试}。
5)后台修改zztest的数据为:上线;
6)此时缓存中有两条数据:{zztest,上线};{zzTest,测试}。
7)而此时zzTest请求时候,得到的还是:测试,出现异常。
导致原因:Mysql的部分编码规则不进行大小写判断,如果zzTest在请求时就报出"code不存在"的异常,就会及早发现问题。当然,个人的不细心也是原因。

附录:不是所有的Mysql都是不区分大小写的,而是和编码规则有关。
以_bin结尾的(如:utf8_bin)区分大小写,意思为binary case sensitive collation,通过二进制比较,区分大小写
以_cs结尾的(如:utf8_general_cs)区分大小写,意思是case sensitive collation
以_ci结尾的(如:utf8_general_ci)区分大小写,意思是case insensitive collation

当然,也不是说设置了编码规则不区分大小写之后,我们所有的查询都没办法区分大小写了,可以使用binary,意思是二进制。
select * from user where binary code = ‘10001’;使用binary之后,就默认按二进制进行比较了。
注意,使用binary时候,就没办法使用索引了,哪怕是utf8_bin编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值