mysql匹配时区分大小写_MySQL匹配不区分大小写怎么解决

场景是这样的,小马在搞一个类似匹配口令兑换奖励的项目,比如类似淘口令,aaBbC兑换礼品 A礼包。最简单的实现方式就是MySQL记录口令码和礼包映射,然后查询匹配。一切似乎看起来没啥问题,然而产品提出了一个问题,如果用AaBbC或者AABbC也能兑换成功,说明MySQL的查询语句是能匹配的。本质上,如果业务允许这么兼容大小写匹配也问题不大,但是因为一些其他问题的设置,比如根据口令码缓存,那么就会很多的缓存key,显然不是很合理。于是,就有了下面的分享。

小马的语句大概如下:

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  binarykeyword= 'aaBbC';

小马亲测可行。但要注意此种解决方案中的SQL语法是否能被当前项目的DB层识别,因为有些是DB代理或者框架封装的DB底层可能不认识这个语法。

2、修改字段的字符集

ALTER  TABLE  TableA   MODIFY  COLUMN  keyword  VARCHAR(50)  BINARYCHARACTER  SET  utf8 COLLATE utf8_bin;

9d54532fcf88

对于CHAR、VARCHAR和TEXT类型,BINARY属性可以为列分配该列字符集的 校对规则。

BINARY属性是指定列字符集的二元 校对规则的简写,排序和比较基于数值字符值。因此也就自然区分了大小写。

问题来了,如果直接设置成BINARY 类型呢,是不是也就直接支持了大小写匹配?

9d54532fcf88

9d54532fcf88

微微一笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值