做一个积极的人
编码, 改 bug, 提升自己
我有一个乐园, 面向编程, 春暖花开!
00 简单回顾
之前写过一篇关于 MySQL 对表大小写敏感的问题, 其实在 MySQL 中字段存储的内容是不区分大小写的, 本篇进行简单的总结.
想回顾一下:
MySQL 在 Linux 下数据库名, 表名, 列名, 别名大小写规则是这样的:
1, 数据库名与表名是严格区分大小写的;
2, 表的别名是严格区分大小写的;
3, 列名与列的别名在所有的情况下均是忽略大小写的;
4, 字段内容默认情况下是大小写不敏感的.
01 一个例子
简单例子:
- 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 的用户, 结果查询出这个三条记录全部都查询到了.
- MySQL> SELECT username from tb_user where username = 'user';
- +----------+
- | username |
- +----------+
- | user |
- | User |
- | USER |
- +----------+
- 3 rows in set
通过这个例子简单说明, 字段内容默认情况下是大小写不敏感的.
02 解决方案
因为默认情况下字段内容是不区分大小写的, 也即大小写不敏感. 所以解决方案就是要新增字段内容的校验规则.
使用 MySQL 的 BINARY 关键字使搜索区分大小写.
在查询的 sql 中加入 BINARY 关键字
- MySQL> select * from tb_user where BINARY username ='user';
- +----+----------+
- | id | username |
- +----+----------+
- | 1 | user |
- +----+----------+
- 1 row in set
这种方式相对较简单, 不用改动表结构, 只需在需要区分查询的字段前加上关键字. 这种方式也是有缺点的, 每次写查询的时候都要注意加关键字, 并可能需要改动的代码较多.
在创建表的时候进行限制
- 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
或者 使用
- 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)utf8bin:utf8bin 将字符串中的每一个字符用二进制数据存储, 区分大小写.
2)utf8generalci:utf8generaci 不区分大小写, ci 为 case insensitive 的缩写, 即大小写不敏感.
3)utf8generalcs:utf8generalcs 区分大小写, cs 为 case sensitive 的缩写, 即大小写敏感.
注: 我本机使用 5.7 版本不支持 utf8generalcs 字符集, 创建报错.
通过上一篇和这一篇的内容, 详细大家对 MySQL 对大小写敏感的问题也有一定的认识了, 在实际的开发中, 库和表名最好使用小写字母, 注意字段存储内容的大写问题. 并且让本地开发环境 MySQL 的配置和服务器上 MySQL 的配置保持一致, 这样防止因为环境不一致而出现一些诡异问题.
你在开发中有没有遇到一些诡异的问题呢? 欢迎留言分享.
04 参考资料
https://www.cnblogs.com/wzmenjoy/p/4244545.html
谢谢你的阅读, 如果您觉得这篇博文对你有帮助, 请点赞或者喜欢, 让更多的人看到! 祝你每天开心愉快!
不管做什么, 只要坚持下去就会看到不一样! 在路上, 不卑不亢!
https://aflyun.blog.csdn.net/
愿你我在人生的路上能都变成最好的自己, 能够成为一个独挡一面的人
© 每天都在变得更好的阿飞云
来源: https://www.cnblogs.com/aflyun/p/11047737.html