在MySQL使用中,操作系统Windows下不区分大小写,但在Linux下默认是区分大小写的,如果稍不注意,就会出现未知问题。在MySQL中,可以使用参数区分大小写的方式比较库名、表名和数据,以及表空间文件是否以区分大写的方式存储在磁盘上。
大小写敏感介绍
在MySQL5.7版本中,使用lower_case_table_names参数可以初始化之后进行更改。但到MySQL8.0版本后,初始化之后,就无法进行更改。不同的操作系统默认值取值也不一样,所以初始安装MySQL时,一定要进行配置。
- Default Value (macOS) 2:表名将按给定存储,但以小写进行比较。
- Default Value (Unix) 0:表名将按指定存储,比较区分大小写。
- Default Value (Windows) 1:表名将以小写存储在磁盘上,比较不区分大小写。
备注:库名还是小写(0,1),只对表名和底层文件会按照大小写写入。
#当设置lower_case_table_names=0时,表名文件名大小写区分,库名不区分。
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| TEST1 |
| test1 |
+-----------------+
2 rows in set (0.00 sec)
#底层ibd文件也区分大小写
shell# tree
.
├── db.opt
├── test1.frm
├── TEST1.frm
├── test1.ibd
└── TEST1.ibd
#静态参数,无法动态更改。
mysql> set global lower_case_table_names=1;
ERROR 1238 (HY000): Variable 'lower_case_table_names' is a read only variable
在MySQL8.0版本中,当lower_case_table_names变更是,就提示无法更改。必须使用初始化时候的值。
[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
除此之外lower_case_file_system参数是数据目录所在的文件系统上文件名的大小写敏感性。OFF表示文件名区分大小写,ON表示文件名不区分大小写。只是一个只读参数,无法被修改,这个参数是用来告诉在当前的系统平台下,是否对文件名大小写敏感。
#如配置文件设置,会提示无法识别参数:
[ERROR] [MY-000067] [Server] unknown variable 'lower_case_file_system=ON'.
[ERROR] [MY-010119] [Server] Aborting
官方说明如下:

验证
lower_case_table_names=0大小写区分下,各项表现。
1. 创建库名,区分大小写:
#创建大小写库名
mysql> create database Db1;
Query OK, 1 row affected (0.01 sec)
#显示库名
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| Db1 |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
#大写库名,区分
mysql> use DB1
ERROR 1049 (42000): Unknown database 'DB1'
mysql> use Db1
Database changed
2.创建表,字段 大小写区分:
区分大小表名
mysql> CREATE TABLE Test(Id int ,NAME VARCHAR(20));
Query OK, 0 rows affected (0.03 sec)
mysql show create table Test;
+-------+-----------------------------------------------------------------------------+
| Table | Create Table | +-------+-----------------------------------------------------------------------------+
| Test | CREATE TABLE `Test` (
`Id` int DEFAULT NULL,
`NAME` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-----------------------------------------------------------------------------+
1 row in set (0.01 sec)
#表名区分大小写
mysql> SELECT * FROM test;
ERROR 1146 (42S02): Table 'Db1.test' doesn't exist
#column不区分大小写
mysql> SELECT id,name FROM Test;
Empty set (0.00 sec)
3.对于数据的大小写敏感:
mysql> INSERT INTO Test(id,name) VALUES(1,'Aa');
Query OK, 1 row affected (0.02 sec)
#对于查询数据不区分大小写
mysql> SELECT id,name FROM Test WHERE name='aa';
+------+------+
| id | name |
+------+------+
| 1 | Aa |
+------+------+
1 row in set (0.00 sec)
mysql> SELECT id,name FROM Test WHERE name='Aa';
+------+------+
| id | name |
+------+------+
| 1 | Aa |
+------+------+
1 row in set (0.00 sec)
mysql> SELECT id,name FROM Test WHERE name='AA';
+------+------+
| id | name |
+------+------+
| 1 | Aa |
+------+------+
1 row in set (0.00 sec)
mysql> SELECT id,name FROM Test WHERE name='aA';
+------+------+
| id | name |
+------+------+
| 1 | Aa |
+------+------+
1 row in set (0.00 sec)
综合以上几个Case可得出如下结论(Linux下):
- 对数据库名和表名的大小写是敏感。(因为Linux系统本身对大小写就敏感)
- 字段里的数据大小写不敏感。
- 列名大小写不敏感。
数据大小写敏感实现
对于数据保存可以使用Colleate规则实现大小写敏感:
- *_bin: 表示的是binary case sensitive collation,也就是说是区分大小写。
- *_ci: case insensitive collation,不区分大小写。
示例如下:
mysql> CREATE TABLE Test1(Id int ,Name VARCHAR(20) COLLATE utf8mb4_bin );
mysql> INSERT INTO Test1(id,name) VALUES(2,'Bb');
#查询
mysql> SELECT id,name FROM Test1 WHERE name='bb';
Empty set (0.00 sec)
mysql> SELECT id,name FROM Test1 WHERE name='bB';
Empty set (0.00 sec)
mysql> SELECT id,name FROM Test1 WHERE name='Bb';
+------+------+
| id | name |
+------+------+
| 2 | Bb |
+------+------+
1 row in set (0.00 sec)
大小写敏感常见问题
1.在MySQL8.0版本前,支持更改大小写敏感参数更改。改完之后会发现,有些表结构更改操作或SQL查询失败问题。
2.在MySQL8.0版本大小写敏感参数,维持初始化值。
3.主从复制下,大小写敏感配置不一样。导致复制失败。
4.跨平台备份恢复,复制,由于大小写差异导致的问题。
总结
为了避免大小写引发的问题,在定义数据库、表、列的时,全部采用小写字母加下划线的方式,没有特殊要求,不使用任何大写字母。




