暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

MySQL 大小写敏感设置解读

原创 CuiHulong 2024-08-20
1213

在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

官方说明如下:
image.png

验证

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.跨平台备份恢复,复制,由于大小写差异导致的问题。

总结

为了避免大小写引发的问题,在定义数据库、表、列的时,全部采用小写字母加下划线的方式,没有特殊要求,不使用任何大写字母。

最后修改时间:2024-08-21 10:10:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论