温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL中varchar的大小写字符比较

发布时间:2021-08-24 17:37:08 来源:亿速云 阅读:291 作者:chen 栏目:MySQL数据库

这篇文章主要介绍“MySQL中varchar的大小写字符比较”,在日常操作中,相信很多人在MySQL中varchar的大小写字符比较问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中varchar的大小写字符比较”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!


背景:
程序某日提出的SQL问题, 发现比较varchar字符串内容的时候, 大小写不敏感;
测试环境还原问题, 环境构造如下:

  1. create table case_sen(id int primary key, name varchar(32)notnull);

  2. insert into case_sen values(1,'LucyLoveLily');

  3. insert into case_sen values(2,'lucylovelily');

  4. insert into case_sen values(3,'TomHateLarry');

  5. insert into case_sen values(4,'tomhatelarry');


效果如下:
MySQL中varchar的大小写字符比较

实际上程序希望只有id=1的匹配到,  
同样的问题也出现在like里面:
MySQL中varchar的大小写字符比较

程序有问是不是lower_case_table_names的问题, 显然.........不是 _(:з」∠)_

场景:
MySQL-5.7进行的还原, 实际上这个问题和版本没有关系;


分析:
首先可以确认的是, 表内的数据并没有问题, 该大写的还是大写, 该小写的还是小写;

那么问题最有可能出在MySQL的运算符"="和like上, 这两类运算的原理可能因为某些原因/设置/导致不进行大小写区分;

排查方向定下来以后, 试着用关键字comparison, case sensitive在文档里面找找, 发现有一个章节提到了这个问题,并给出了一些示例;
PS: 章节名  B.5.4.1 Case Sensitivity in String Searches

文档示例如图:
MySQL中varchar的大小写字符比较

对文档的描述进行归纳:  非binary类型的string进行逻辑运算时, 会依据collate的配置来计算结果;

所以如果collate的设置对大小写不敏感, 那么就会出现测试环境中的效果;

那么问题来了, utf8mb4的默认collate是什么?
MySQL中varchar的大小写字符比较

发现是utf8mb4_general_ci, 通过对文档内容的分析, 这个后缀ci代表的意思应该就是case-insensitive ;

那么试着换一下字符集的collate, 看看是不是能区分大小写;
MySQL中varchar的大小写字符比较

Bingo~~~

当然, 在列上面指定collate为utf8mb4_bin也可以达到一样的目的;

PS: mysql的所有字符集默认都使用XXX_general_ci, 而有的字符集会有XXX_general_cs, 但是utf8是没有的, 所以要使用utf8_bin;

PPS: 兴趣阅读: https://www.percona.com/live/europe-amsterdam-2015/sites/default/files/slides/PL_AMS_Unicode_Booking169_v3.pdf

PS: 注意索引哟, 5.7是可以的, <5.7可没有试过 ╰(*°▽°*)╯
MySQL中varchar的大小写字符比较

到此,关于“MySQL中varchar的大小写字符比较”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI