场景是这样的,小马在搞一个类似匹配口令兑换奖励的项目,比如类似淘口令,aaBbC兑换礼品 A礼包。最简单的实现方式就是MySQL记录口令码和礼包映射,然后查询匹配。一切似乎看起来没啥问题,然而产品提出了一个问题,如果用AaBbC或者AABbC也能兑换成功,说明MySQL的查询语句是能匹配的。本质上,如果业务允许这么兼容大小写匹配也问题不大,但是因为一些其他问题的设置,比如根据口令码缓存,那么就会很多的缓存key,显然不是很合理。于是,就有了下面的分享。
mysql查询不区分大小写
小马的语句大概如下:
select * from TableA where keyword= 'aaBbC';
于是把语句换成:
select * from TableA where keyword= 'AaBbC';
果然是匹配的,说明查询条件对大小写不敏感。那么是什么问题呢?也就是SQL默认匹配字符集是不会区分大小写的。
两种解决方案
1、在SQL中使用BINARY
BINARY运算符将紧随其后的 string 转换为二进制字符串。
主要用来强制进行按字节进行比较(byte by byte),字节而不是字符的字符。这使得字符串比较是区分大小写的, 不管原始的列定义是否是 BINARY 或者 BLOB。BINARY 也对字符串末尾的空格敏感。
于是改后语句如下:
select * from TableA where binary keyword= 'aaBbC';
小马亲测可行。但要注意此种解决方案中的SQL语法是否能被当前项目的DB层识别,因为有些是DB代理或者框架封装的DB底层可能不认识这个语法。
2、修改字段的字符集
ALTER TABLE TableA MODIFY COLUMN keyword VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin;
对于CHAR、VARCHAR和TEXT类型,BINARY属性可以为列分配该列字符集的 校对规则。
BINARY属性是指定列字符集的二元 校对规则的简写,排序和比较基于数值字符值。因此也就自然区分了大小写。
问题来了,如果直接设置成BINARY 类型呢,是不是也就直接支持了大小写匹配?
微微一笑
网友评论