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

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!分享一下大神老师的人工智能教程。零基础!通俗易懂!风趣幽默(偶尔开开车,讲讲黄段子)!大家可以看看是否对自己有帮助,如果你对人工智能感兴趣,希望你也加入到我们人工智能的队伍中来,点击这里查看【人工智能教程】。接下来进入正文。文章目录00 简单回顾01 一个例子02 解决方案03 总结04 参考资料00 简单回…

大家好,又见面了,我是全栈君。

做一个积极的人

编码、改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)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://www.techonthenet.com/mysql/functions/binary.php

https://www.cnblogs.com/wzmenjoy/p/4244545.html


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!


不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页 : https://aflyun.blog.csdn.net/

愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人
MySQL字段存储的内容是不区分大小写的,你知道吗?

© 每天都在变得更好的阿飞云

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121006.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Linux 的解压缩文件命令「建议收藏」

    Linux 的解压缩文件命令「建议收藏」博客园首页新随笔联系管理随笔-122 文章-0 评论-14 压缩文件 tar -zcvf my.tarabcabc.txtar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式:单个文件压缩打包tarczvfmy.tarfile1多个文件压缩打包tarczvfmy.tarfile1file2,…单个目录压缩打包tarczvfmy.tar…

  • jmeter 分布式测试

    jmeter 分布式测试

  • NFV SDN_sdn和nfv与云计算

    NFV SDN_sdn和nfv与云计算专业技术分析NFV与SDN的区别是什么?5条评论2013-06-1400:01   it168网站原创 作者:vivia/译 编辑: 闫志坤  【IT168技术】软件定义型网络(SDN)和网络功能虚拟化(NFV)都是热议的话题。他们之前显然是有关系的,但是它们有哪些地方类似呢?不同之处又在哪里?二者如何做到相互补充呢?  SDN——诞生于高校,成

  • Eclipse如何安装svn插件及使用「建议收藏」

    Eclipse如何安装svn插件及使用「建议收藏」Eclipse中使用SVN此文章对Myeclipse同样适用。一.在Eclipse里下载Subclipse插件方法一:从EclipseMarketplace里面下载具体操作:打开Eclipse–>Help–>EclipseMarketplace–>在Find中输入subclipse搜索–>找到subclipse点击in…

  • ScriptManager.RegisterStartupScript 方法

    ScriptManager.RegisterStartupScript 方法1、ScriptManager.RegisterStartupScript方法(Page,Type,String,String,Boolean): 参数page类型:System.Web.UI.Page正在注册该客户端脚本块的页对象。type类型:System.Type该客户端脚本块的类型。通常使用typeof运算符(C#)或GetType运算符(VisualBasic)来指定该参数,以检索正在注册该脚本的控件的类型。key类型:System.String该脚本块的唯一标识符。

  • OA工作流实现的一点经验

    OA工作流实现的一点经验最近给学生布置.NET毕业设计,为了提高学生的能力就布置了一个OA系统,布置后发现OA其实也不是哪么的难做,其中最难做的应该要算工作流哪部分,于是我就给学生写了一个工作流的例子.其实在J2EE的开源里面就有工作流开源项目大家可以参考http://www.open-open.com

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号