您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

MySQL存储的字段是不区分大小写的,你知道吗?

2024/5/24 9:14:38发布33次查看
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)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的配置保持一致,这样防止因为环境不一致而出现一些诡异问题。
你在开发中有没有遇到一些诡异的问题呢?欢迎留言分享。
更多mysql相关技术文章,请访问mysql教程栏目进行学习!
以上就是mysql存储的字段是不区分大小写的,你知道吗?的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product