美文网首页PHP开发程序园
MySQL匹配不区分大小写怎么解决

MySQL匹配不区分大小写怎么解决

作者: 小马过河R | 来源:发表于2020-09-23 10:11 被阅读0次

    场景是这样的,小马在搞一个类似匹配口令兑换奖励的项目,比如类似淘口令,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 类型呢,是不是也就直接支持了大小写匹配?

    微微一笑

    相关文章

      网友评论

        本文标题:MySQL匹配不区分大小写怎么解决

        本文链接:https://www.haomeiwen.com/subject/xrynyktx.html