OR博客
MySQL字段值大小写问题
苗锦洲
创建于:2021-12-06 20:02:51
0
25
186
0
MySQL存储的字段是不区分大小写的,你知道吗?
转载自:[MySQL存储的字段是不区分大小写的,你知道吗? - 阿飞云 - 博客园 (cnblogs.com)](https://www.cnblogs.com/aflyun/p/11047737.html) --- # [MySQL存储的字段是不区分大小写的,你知道吗?](https://www.cnblogs.com/aflyun/p/11047737.html) ![在这里插入图片描述](https://oss.ordinaryroad.top/api/download/thumbnail/2021-12-06/86c55f72be2f4a9793f9bc0bb814e146.jpeg) > 做一个积极的人 > > 编码、改bug、提升自己 > > 我有一个乐园,面向编程,春暖花开! ## 00 简单回顾 之前写过一篇关于mysql 对表大小写敏感的问题,其实在mysql中字段存储的内容是不区分大小写的,本篇进行简单的总结。 想回顾一下: MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的: 1、数据库名与表名是严格区分大小写的; 2、表的别名是严格区分大小写的; 3、列名与列的别名在所有的情况下均是忽略大小写的; **4、字段内容默认情况下是大小写不敏感的。** ## 01 一个例子 简单例子: ```sql CREATE TABLE `tb_user` ( `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` VARCHAR (50) NOT NULL COMMENT '用户名', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用户表'; INSERT INTO `u2s`.`tb_user` (`id`, `username`) VALUES ('1', 'user'); INSERT INTO `u2s`.`tb_user` (`id`, `username`) VALUES ('2', 'User'); INSERT INTO `u2s`.`tb_user` (`id`, `username`) VALUES ('3', 'USER'); ``` 使用 查询语句查询 username 为 全部小写的 `user` 的用户,结果查询出这个三条记录全部都查询到了。 ```sql mysql> SELECT username from tb_user where username = 'user'; +----------+ | username | +----------+ | user | | User | | USER | +----------+ 3 rows in set ``` 通过这个例子简单说明,字段内容默认情况下是大小写不敏感的。 ## 02 解决方案 **因为默认情况下字段内容是不区分大小写的,也即大小写不敏感。** 所以解决方案就是要新增字段内容的校验规则。 使用mysql 的 `BINARY` 关键字使搜索区分大小写。 **在查询的sql中加入 `BINARY` 关键字** ```sql mysql> select * from tb_user where BINARY username ='user'; +----+----------+ | id | username | +----+----------+ | 1 | user | +----+----------+ 1 row in set ``` 这种方式相对较简单,不用改动表结构,只需在需要区分查询的字段前加上关键字。这种方式也是有缺点的,每次写查询的时候都要注意加关键字,并可能需要改动的代码较多。 **在创建表的时候进行限制** ```sql CREATE TABLE `tb_user1` ( `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` VARCHAR (50) BINARY NOT NULL COMMENT '用户名', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用户表'; mysql> show create table tb_user1; tb_user1 | CREATE TABLE `tb_user1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '用户名', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表' 1 row in set ``` 或者 使用 ```sql CREATE TABLE `tb_user2` ( `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` VARCHAR (50) NOT NULL COMMENT '用户名', `info` VARCHAR (100) NOT NULL COMMENT '详情描述', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COLLATE=utf8_bin COMMENT = '用户表'; mysql> show create table tb_user2; tb_user2 | CREATE TABLE `tb_user2` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '用户名', `info` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '详情描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户表' ``` 使用 `NGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin`会将字段中varchar类型的全部设置区分大小写。这两种查看表的详情,本质上都是 在字段上 加上了 `COLLATE utf8_bin`。 ## 03 总结 字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则。 一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以 *ci(大小写不敏感)、* cs(大小写敏感)或_bin(二元)结束 。 比如 utf8字符集,,如下表: 1)utf8*bin:utf8*bin将字符串中的每一个字符用二进制数据存储,区分大小写。 2)utf8*general*ci:utf8*genera*ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。 3)utf8*general*cs:utf8*general*cs区分大小写,cs为case sensitive的缩写,即大小写敏感。 注:我本机使用5.7 版本不支持 utf8*general*cs 字符集,创建报错。 通过上一篇和这一篇的内容,详细大家对mysql对大小写敏感的问题也有一定的认识了,在实际的开发中,库和表名最好使用小写字母,注意字段存储内容的大写问题。并且让本地开发环境mysql的配置和服务器上mysql的配置保持一致,这样防止因为环境不一致而出现一些诡异问题。 你在开发中有没有遇到一些诡异的问题呢?欢迎留言分享。 ## 04 参考资料 [https://dev.mysql.com/doc/search/?d=12&p=1&q=binary](https://dev.mysql.com/doc/search/?d=12&p=1&q=binary) [https://www.techonthenet.com/mysql/functions/binary.php](https://www.techonthenet.com/mysql/functions/binary.php) https://www.cnblogs.com/wzmenjoy/p/4244545.html --- **谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!** --- **不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!** [ ](https://aflyun.blog.csdn.net/) **愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人**![](https://oss.ordinaryroad.top/api/download/thumbnail/2021-12-06/fa88233d238741749ddbdde317e06038.png) © 每天都在变得更好的阿飞云 版权声明 作者:阿飞云 出处:博客园阿飞云的技术博客--http://www.cnblogs.com/aflyun 您的支持是对博主最大的鼓励,感谢您的认真阅读。 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 分类: [Mysql](https://www.cnblogs.com/aflyun/category/947157.html) 标签: [Mysql 大小写敏感](https://www.cnblogs.com/aflyun/tag/Mysql%20%E5%A4%A7%E5%B0%8F%E5%86%99%E6%95%8F%E6%84%9F/), [Mysql binary](https://www.cnblogs.com/aflyun/tag/Mysql%20binary/), [mysql 字段大小写敏感](https://www.cnblogs.com/aflyun/tag/mysql%20%E5%AD%97%E6%AE%B5%E5%A4%A7%E5%B0%8F%E5%86%99%E6%95%8F%E6%84%9F/), [Mysql COLLATE](https://www.cnblogs.com/aflyun/tag/Mysql%20COLLATE/)
评论
楼主暂时不想被别人评论哦~