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


本文摘自PHP中文网,作者步履不停,侵删。

00 简单回顾

之前写过一篇关于mysql 对表大小写敏感的问题,其实在mysql中字段存储的内容是不区分大小写的,本篇进行简单的总结。

想回顾一下:

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

1、数据库名与表名是严格区分大小写的;

2、表的别名是严格区分大小写的;

3、列名与列的别名在所有的情况下均是忽略大小写的;

4、字段内容默认情况下是大小写不敏感的。

01 一个例子

简单例子:

1

2

3

4

5

6

7

8

9

10

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 的用户,结果查询出这个三条记录全部都查询到了。

1

2

3

4

5

6

7

8

9

mysql> SELECT username from tb_user where username = 'user';

+----------+

| username |

+----------+

| user     |

| User     |

| USER     |

+----------+

3 rows in set

通过这个例子简单说明,字段内容默认情况下是大小写不敏感的。

02 解决方案

**因为默认情况下字段内容是不区分大小写的,也即大小写不敏感。**所以解决方案就是要新增字段内容的校验规则。

使用mysql 的BINARY 关键字使搜索区分大小写。

在查询的sql中加入BINARY 关键字

1

2

3

4

5

6

7

mysql> select * from tb_user where BINARY username ='user';

+----+----------+

| id | username |

+----+----------+

|  1 | user     |

+----+----------+

1 row in set

这种方式相对较简单,不用改动表结构,只需在需要区分查询的字段前加上关键字。这种方式也是有缺点的,每次写查询的时候都要注意加关键字,并可能需要改动的代码较多。

在创建表的时候进行限制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

或者 使用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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存储的字段是不区分大小写的,你知道吗?的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

mysql 如何查表数据

mysql 8.0.2复制新特性的详细介绍

mysql workbench是什么

mysql修改权限后本地无法登录怎么办

mysql免安装版(zip)安装配置详细教程

mysql 无法成功启动服务怎么办

详解mysql常用功能

mysql数据库导出excel xml等格式文件

mysql中delete from where子查询的限制介绍

mysql如何建立约束

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...