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

点击上方Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!00 简单回顾之前写过一篇关于mysql 对表大…

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

点击上方Java编程技术乐园,轻松关注!

及时获取有趣有料的技术文章

做一个积极的人
编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

00 简单回顾

之前写过一篇关于mysql 对表大小写敏感的问题(你有遇到过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

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

MySQL存储的字段是不区分大小写的,你知道吗?欢迎长按下图关注公众号MySQL存储的字段是不区分大小写的,你知道吗?

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

后台回复【资源】,获取珍藏干货!

99.9%的伙伴都很喜欢MySQL存储的字段是不区分大小写的,你知道吗?

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

推荐阅读

你有遇到过MySQL因大小写敏感导致的问题吗

MySQL 的COUNT(x)性能怎么样?

共勉:作为一名程序员你应该怎么提一个高质量的问题?

Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

程序员 你读过的书,藏着自己的命运 | 技术类(一)

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

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

     你点的每个在看,我都认真当成了喜欢❤

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121007.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MYSQL安装出现问题(The service already exists)

    MYSQL安装出现问题(The service already exists)1.Zip解压后管理员身份运行cmd(系统win10)2.输入命令cd/dF:\mysql-5.7.19-win32\bin(此为解压目录)3.输入安装命令mysqldinstall出现问题Theservicealreadyexists这是由于之前已经安装过mysql并且没有删除干净4.重新以管理员身份运行,输入scquerymysql,查看一下名为mysql的

    2022年7月12日
    30
  • JVM相关问题整理

    备注:针对基本问题做一些基本的总结,不是详细解答!1.运行时数据区域(内存模型)(必考)2.垃圾回收机制(必考)3.垃圾回收算法(必考)4.MinorGC和FullGC触发条件5.GC中Stoptheworld(STW)6.各垃圾回收器的特点及区别,怎么做选择?7.双亲委派模型8.JDBC和双亲委派模型关系9.JVM锁优化和锁膨胀过程10.JVM中G…

    2022年4月6日
    29
  • ManagementObject_getsuperclass方法

    ManagementObject_getsuperclass方法原文:http://blog.csdn.net/hardstone1/article/details/5380775网上代码和MSDN帮助中都没有列出 ManagementObject[""]这里到底有哪些属性可以使用,参考了http://www.groupsrv.com/dotnet/about69957.html了之后发现了可以枚举出来所有属性,代码如函数getallprop()。…

    2022年10月2日
    0
  • 什么是python标识符?_python语言正确的标识符

    什么是python标识符?_python语言正确的标识符简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。Python中标识符的命名不是随意的,而是要遵守一定的命令规则,比如说:标识符是由字符(A~Z和a~z)、下划线和数字组成,但第一个字符不能是数字。标识符不能和Python中的保留字相同。有关保留字,后续章节会详细介绍。Python中的标识符中,不能包含空格、@、%以及$等特殊字符。例如,下面所列举的标识符是合法的:UserIDnamemode12

    2022年9月8日
    0
  • window10怎么提供管理员权限删除文件_如何用管理员权限删除文件

    window10怎么提供管理员权限删除文件_如何用管理员权限删除文件http://www.xitongcity.com/jiaocheng/win8_content_3473.html很多win8.1系统用户在对磁盘文件进行清理时,经常会遇到“文件夹访问被拒绝,您需

    2022年8月1日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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