当前位置: 首页 >数据库 > MySQL大小写敏感

MySQL大小写敏感

MySQL大小写敏感问题

本文档适用于Linux平台(红帽6,MySQL5.7.24),windows和mac不建议参考

MySQL数据库在Linux平台默认是区分大小写,这和windows不一致。大小写敏感包括库名、表名、字段名、别名、字段内容、变量等。在Linux服务上,MySQL提供了配置参数 lower_case_table_names 来控制打开大小写敏感的开关。同时,大小写敏感还和排序规则有关。

结论:

1、lower_case_table_names 参数控制库名和表名的大小写敏感,值为0是代表大小写敏感,值为1代表大小写不敏感。linux平台默认为0(大小写敏感)

2、排序规则控制字段内容大小写敏感,utf8_general_ci 大小写不敏感 ,utf8_bin大小写敏感

3、字段名和字段别名任何情况下都不敏感

4、用户变量不区分大小写

5、反引号对大小写不影响,反引号只是影响关键字作为表名、字段名。和其他数据库用的双引号不一样

大小写是否敏感库名表名表别名字段名字段别名字段内容变量
lower_case_table_name = 0  utf8_general_ci
lower_case_table_name = 1  utf8_general_ci
lower_case_table_name = 0  utf8_bin
lower_case_table_name = 1  utf8_bin

验证步骤:

配置参数 lower_case_table_names = 0,排序规则默认 utf8_general_ci。

#库名区分大小写mysql> create database db;Query OK, 1 row affected (0.35 sec)mysql> create database DB;Query OK, 1 row affected (0.00 sec)#表名区分大小写mysql> create table t1(a int,b varchar(5));Query OK, 0 rows affected (0.02 sec)mysql> create table T1(a int,b varchar(5));Query OK, 0 rows affected (0.03 sec)# 表的别名区分大小写mysql> select * from test t where t.a = 1;+------+| a|+------+|1 |+------+1 row in set (0.12 sec)mysql> select * from test t where T.a = 1;ERROR 1054 (42S22): Unknown column 'T.a' in 'where clause'# 自定义变量不区分大小写mysql> set @age = 18;Query OK, 0 rows affected (0.00 sec)mysql> set @AGE = 19;Query OK, 0 rows affected (0.00 sec)mysql> select @age, @AGE;+------+------+| @age | @AGE |+------+------+|19 |19 |+------+------+1 row in set (0.00 sec)# 字段名不区分大小写mysql> create table test(a int,B int,A int);ERROR 1060 (42S21): Duplicate column name 'A'mysql> create table test(a int,B int);Query OK, 0 rows affected (0.14 sec)#数据内容不区分大小写mysql> create table test(a int,b varchar(5));Query OK, 0 rows affected (0.14 sec)mysql> insert into test values(1,'aa'),(2,'AA'),(3,'Aa');Query OK, 3 rows affected (0.01 sec)Records: 3  Duplicates: 0  Waings: 0mysql> select * from test where b = 'aa';+------+------+| a| b|+------+------+|1 | aa||2 | AA||3 | Aa|+------+------+3 rows in set (0.00 sec)

配置参数 lower_case_table_names = 1,排序规则默认 utf8_general_ci

#库名大小写不敏感mysql> create database db;Query OK, 1 row affected (1.75 sec)mysql> create database DB;ERROR 1007 (HY000): Can’t create database 'db'; database exists# 表名大小写不敏感mysql> create table t(a int);Query OK, 0 rows affected (0.12 sec)mysql> create table T(a int);ERROR 1050 (42S01): Table 't' already exists# 自定义变量不区分大小写mysql> set @age = 18;Query OK, 0 rows affected (0.00 sec)mysql> set @AGE = 19;Query OK, 0 rows affected (0.00 sec)mysql> select @age, @AGE;+------+------+| @age | @AGE |+------+------+|19 |19 |+------+------+1 row in set (0.00 sec)mysql> select * from test t where T.a = 1;+------+| a|+------+|1 |+------+1 row in set (0.00 sec)#数据内容不区分大小写mysql> create table test(a int,b varchar(5));Query OK, 0 rows affected (0.14 sec)mysql> insert into test values(1,'aa'),(2,'AA'),(3,'Aa');Query OK, 3 rows affected (0.01 sec)Records: 3  Duplicates: 0  Waings: 0mysql> select * from test where b = 'aa';+------+------+| a| b|+------+------+|1 | aa||2 | AA||3 | Aa|+------+------+3 rows in set (0.00 sec)

从上变例子可以看出 lower_case_table_names 配置参数,用来控制库名、表名、表别名大小写敏感,值为0时区分大小写,值为1时不区分大小写。

有时会遇到这样一种情况,执行条件检索时,返回的数据和期忘的数据不一致。例如,查询 name = 'a'时,name = 'A' 的数据也一并返回了。这时就需要设置字段内容的大小写敏感。

当使用utf8字符集时,默认的排序规则为uft8_general_ci,大小写时不敏感的。如果设置大小写敏感,提供以下几种解决方案:

1、创建表时,字段标记为binary。二进制大小写是敏感的,不建议使用,会使索引字段失败。

mysql> create table test(a int,b varchar(5) binary);Query OK, 0 rows affected (0.18 sec)mysql> insert into test values(1,'AA'),(2,'aa'),(3,'Aa');Query OK, 3 rows affected (0.42 sec)Records: 3  Duplicates: 0  Waings: 0mysql> select * from test where b = 'aa';+------+------+| a| b|+------+------+|2 | aa|+------+------+1 row in set (0.00 sec)

2、建表时,指定排序规则为utf8_bin

mysql> create table test(a int,b varchar(5)) character set utf8 collate utf8_bin;Query OK, 0 rows affected (1.38 sec)mysql> insert into test values(1,'AA'),(2,'aa'),(3,'Aa');Query OK, 3 rows affected (0.16 sec)Records: 3  Duplicates: 0  Waings: 0mysql> select * from test where b = 'aa';+------+------+| a| b|+------+------+|2 | aa|+------+------+1 row in set (0.21 sec)

3、建表时,指定字段排序规则为utf8_bin

mysql> create table test(a int,b varchar(5) collate utf8_bin, c varchar(5));Query OK, 0 rows affected (0.17 sec)mysql> insert into test values(1,'b','c'),(2,'B','c'),(3,'b','C');Query OK, 3 rows affected (0.14 sec)Records: 3  Duplicates: 0  Waings: 0mysql> select * from test where b = 'b';+------+------+------+| a| b| c|+------+------+------+|1 | b| c||3 | b| C|+------+------+------+2 rows in set (0.13 sec)mysql> select * from test where c = 'C';+------+------+------+| a| b| c|+------+------+------+|1 | b| c||2 | B| c||3 | b| C|+------+------+------+3 rows in set (0.00 sec)

4、也可以修改字段的排序规则

alter table test3 modify name varchar(20) collate utf8_bin;

以上所有结论均经过实验得到,如有错误,欢迎指正。

注意事项(后补充):

在修改大小写敏感参数之前,需要注意以下几点:

1.核实实例中是否存在大写的库及表
2.将大写的库名及表名改为小写
更改库名可参考:https://www.cnblogs.com/gomysql/p/3584881.html
更改表名:rename table TEST_TB to test_tb;
3.设置lower_case_table_names = 1
4.重启数据库

在实际运维中曾遇到因修改lower_case_table_names之前没有修改表名,导致原存的大写表名无法查询,且在drop库时,无法正常drop引起主从连接中断等一系列问题

来源链接:https://www.cnblogs.com/jkin/p/12733439.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/database/118259.html

分享给朋友:

“MySQL大小写敏感” 的相关文章

JDBC工具类(DButil) 2022年05月13日 09:13:25
MySQL学习(4)︱数据库的查询 2022年06月07日 01:52:58
mysql查询结果中文显示成了问号 2022年06月07日 02:00:43
mysql 查询表 所有字段 2022年06月09日 20:38:57
mysql 查询操作日志 2022年06月10日 21:58:42
Mysql 查询区分大小写的两种方法 2022年06月11日 20:53:24
mysql 查询所有下级 2022年06月12日 13:42:12