MySQL案例-varchar的大小写字符比较
2020-01-15 09:57
169 查看
-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------
背景:
程序某日提出的SQL问题, 发现比较varchar字符串内容的时候, 大小写不敏感;
测试环境还原问题, 环境构造如下:
效果如下:
实际上程序希望只有id=1的匹配到,
同样的问题也出现在like里面:
程序有问是不是lower_case_table_names的问题, 显然.........不是 _(:з」∠)_
场景:
MySQL-5.7进行的还原, 实际上这个问题和版本没有关系;
分析:
首先可以确认的是, 表内的数据并没有问题, 该大写的还是大写, 该小写的还是小写;
那么问题最有可能出在MySQL的运算符"="和like上, 这两类运算的原理可能因为某些原因/设置/导致不进行大小写区分;
排查方向定下来以后, 试着用关键字comparison, case sensitive在文档里面找找, 发现有一个章节提到了这个问题,并给出了一些示例;
PS: 章节名 B.5.4.1 Case Sensitivity in String Searches
文档示例如图:
对文档的描述进行归纳: 非binary类型的string进行逻辑运算时, 会依据collate的配置来计算结果;
所以如果collate的设置对大小写不敏感, 那么就会出现测试环境中的效果;
那么问题来了, utf8mb4的默认collate是什么?
发现是utf8mb4_general_ci, 通过对文档内容的分析, 这个后缀ci代表的意思应该就是case-insensitive ;
那么试着换一下字符集的collate, 看看是不是能区分大小写;
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
PPPPPPPS: 注意索引哟, 5.7是可以的, <5.7可没有试过 ╰(*°▽°*)╯
背景:
程序某日提出的SQL问题, 发现比较varchar字符串内容的时候, 大小写不敏感;
测试环境还原问题, 环境构造如下:
点击(此处)折叠或打开
- create table case_sen(id int primary key, name varchar(32) not null);
-
insert into case_sen values(1,'LucyLoveLily');
-
insert into case_sen values(2,'lucylovelily');
-
insert into case_sen values(3,'TomHateLarry');
- insert into case_sen values(4,'tomhatelarry');
效果如下:
实际上程序希望只有id=1的匹配到,
同样的问题也出现在like里面:
程序有问是不是lower_case_table_names的问题, 显然.........不是 _(:з」∠)_
场景:
MySQL-5.7进行的还原, 实际上这个问题和版本没有关系;
分析:
首先可以确认的是, 表内的数据并没有问题, 该大写的还是大写, 该小写的还是小写;
那么问题最有可能出在MySQL的运算符"="和like上, 这两类运算的原理可能因为某些原因/设置/导致不进行大小写区分;
排查方向定下来以后, 试着用关键字comparison, case sensitive在文档里面找找, 发现有一个章节提到了这个问题,并给出了一些示例;
PS: 章节名 B.5.4.1 Case Sensitivity in String Searches
文档示例如图:
对文档的描述进行归纳: 非binary类型的string进行逻辑运算时, 会依据collate的配置来计算结果;
所以如果collate的设置对大小写不敏感, 那么就会出现测试环境中的效果;
那么问题来了, utf8mb4的默认collate是什么?
发现是utf8mb4_general_ci, 通过对文档内容的分析, 这个后缀ci代表的意思应该就是case-insensitive ;
那么试着换一下字符集的collate, 看看是不是能区分大小写;
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
PPPPPPPS: 注意索引哟, 5.7是可以的, <5.7可没有试过 ╰(*°▽°*)╯
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29510932/viewspace-2134223/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29510932/viewspace-2134223/
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- MySQL字符类型VARCHAR的长度知识总结
- mysql 字符串类型及二进制字符串类型大小写比较
- mysql 中的CHAR和VARCHAR的细微比较
- mysql中varchar(10)中定义的长度到底是字符长度还是字节长度
- mysql列类型char,varchar,text,tinytext,mediumtext,longtext的比较与选择
- 【mysql】mysql中char、varchar和sqlserver中char、varchar、nvarchar的比较
- MySQL的varchar定义长度到底是字节还是字符
- mysql学习四之mysql的字符类型学习,包含char类型和varchar类型,enum枚举类型,set集合类型,text类型及其兄弟类型。
- MySQL的varchar定义长度到底是字节还是字符
- MySQL的varchar定义长度到底是字节还是字符
- MySQL数据类型char与varchar中数字代表的究竟是字节数还是字符数?
- mysql如何处理varchar与nvarchar类型中的特殊字符
- 比较两个字符串的最长公共子序列的长度,字符不区分大小写
- mysql varchar(20) 是20个字节 还是 20个字符?
- 编写函数,对标准输入进行扫描,并对“the”出现的次数进行计数。 进行比较时应区分大小写。认为一个单词有一个或多个空格字符分隔, 并且输入行在长度上不会超过100个字符,计数结果输出。
- MySQL的varchar定义长度到底是字节还是字符
- mysql varchar 类型 超出字符
- mysql中varchar(10)中定义的长度到底是字符长度还是字节长度
- MySQL数据类型char与varchar中数字代表的究竟是字节数还是字符数?
- mySql字段设置varchar的时间比较