MySQL 5.7 和 MySQL 8.0 在处理大小写敏感性方面有一些差异,这些差异主要体现在操作系统、配置文件和数据库对象名称的处理上。
操作系统的影响
-
Windows:
- 在 Windows 上,默认情况下,MySQL 对表名和数据库名是不区分大小写的。
- 这是因为 Windows 文件系统本身是不区分大小写的。
-
Unix/Linux:
- 在 Unix 和 Linux 系统上,默认情况下,MySQL 对表名和数据库名是区分大小写的。
- 这是因为 Unix 和 Linux 文件系统是区分大小写的。
配置文件设置
可以通过 my.cnf
或 my.ini
配置文件中的 lower_case_table_names
参数来控制 MySQL 的大小写敏感性。
lower_case_table_names
参数 :0
: 表名按照创建时指定的大小写存储(默认值)。1
: 表名在存储时转换为小写。比较操作时不区分大小写。2
: 表名按照创建时指定的大小写存储,但比较操作时不区分大小写。
MySQL 5.7
- 默认情况下,在 Unix 和 Linux 上,
lower_case_table_names
的默认值是0
,即区分大小写。 - 在 Windows 上,
lower_case_table_names
的默认值是1
,即不区分大小写,并且所有表名都转换为小写。
MySQL 8.0
- 在 MySQL 8.0 中,
lower_case_table_names
的行为与 MySQL 5.7 基本相同。 - 但在某些情况下,MySQL 8.0 可能会更加严格地处理大小写问题,特别是在使用新的数据字典功能时。
数据库对象名称的处理
-
表名和数据库名:
- 如果
lower_case_table_names
设置为0
,则表名和数据库名完全按照创建时的大小写进行存储和比较。 - 如果
lower_case_table_names
设置为1
,则表名和数据库名在存储时会被转换为小写。 - 如果
lower_case_table_names
设置为2
,则表名和数据库名在存储时保持原样,但在比较时忽略大小写。
- 如果
-
列名:
- 列名总是不区分大小写,无论
lower_case_table_names
设置为何值。 - 例如,
SELECT column_name FROM table_name;
和SELECT Column_Name FROM Table_Name;
是等价的。
- 列名总是不区分大小写,无论
示例
假设你有一个表名为 Users
,并且 lower_case_table_names
设置为 1
:
-
MySQL 5.7 和 MySQL 8.0 (在 Windows 上):
- 创建表:
CREATE TABLE Users (id INT);
- 存储为:
users
- 查询:
SELECT * FROM users;
和SELECT * FROM Users;
都有效。
- 创建表:
-
MySQL 5.7 和 MySQL 8.0 (在 Unix/Linux 上,
lower_case_table_names=0
):- 创建表:
CREATE TABLE Users (id INT);
- 存储为:
Users
- 查询:
SELECT * FROM Users;
有效,而SELECT * FROM users;
无效。
- 创建表:
-
MySQL 5.7 和 MySQL 8.0 (在 Unix/Linux 上,
lower_case_table_names=1
):- 创建表:
CREATE TABLE Users (id INT);
- 存储为:
users
- 查询:
SELECT * FROM users;
和SELECT * FROM Users;
都有效。
- 创建表:
总结
-
默认行为:
- 在 Windows 上,
lower_case_table_names
默认为1
,不区分大小写。 - 在 Unix/Linux 上,
lower_case_table_names
默认为0
,区分大小写。
- 在 Windows 上,
-
配置选项:
lower_case_table_names=0
:区分大小写。lower_case_table_names=1
:不区分大小写,存储时转为小写。lower_case_table_names=2
:存储时保留原样,比较时忽略大小写。
-
列名:
- 列名总是不区分大小写。
通过合理配置 lower_case_table_names
参数,可以确保数据库在不同操作系统上的行为一致。
在 MySQL 5.7 和 MySQL 8.0 中设置 lower_case_table_names
参数的基本步骤是相似的,但在一些细节和行为上存在一些差异。
共同点
-
配置文件:
- 在两个版本中,你都需要编辑 MySQL 的配置文件(通常是
my.cnf
或my.ini
)。 - 配置项的位置通常在
[mysqld]
部分。
- 在两个版本中,你都需要编辑 MySQL 的配置文件(通常是
-
参数值:
lower_case_table_names=0
:表名按照创建时指定的大小写存储(区分大小写)。lower_case_table_names=1
:表名在存储时转换为小写(不区分大小写)。lower_case_table_names=2
:表名按照创建时指定的大小写存储,但比较操作时不区分大小写。
-
重启服务:
- 在两个版本中,修改配置后都需要重启 MySQL 服务以使更改生效。
区别
-
默认值:
- MySQL 5.7 : 默认值取决于操作系统。在 Unix 系统上,默认值是
0
;在 Windows 上,默认值是1
。 - MySQL 8.0 : 默认值也取决于操作系统。在 Unix 系统上,默认值是
0
;在 Windows 上,默认值是1
。但 MySQL 8.0 引入了更多的平台一致性检查,确保在不同平台上的一致性。
- MySQL 5.7 : 默认值取决于操作系统。在 Unix 系统上,默认值是
-
平台一致性:
- MySQL 5.7: 在某些情况下,如果在不同的操作系统之间迁移数据,可能会遇到大小写敏感的问题。
- MySQL 8.0 : MySQL 8.0 对
lower_case_table_names
的处理更加严格,特别是在跨平台迁移时。例如,如果你从一个lower_case_table_names=0
的系统迁移到lower_case_table_names=1
的系统,MySQL 8.0 可能会更严格地拒绝这种操作,以防止潜在的数据损坏。
-
初始化过程:
- MySQL 5.7 : 初始化过程中,
lower_case_table_names
参数的设置会影响数据目录的结构,但不会阻止初始化过程。 - MySQL 8.0 : MySQL 8.0 在初始化过程中对
lower_case_table_names
参数的设置更为严格。如果你试图在一个已经使用不同lower_case_table_names
设置的数据目录上启动 MySQL 8.0,可能会遇到错误。这有助于防止数据损坏和不一致。
- MySQL 5.7 : 初始化过程中,
-
日志和警告:
- MySQL 5.7 : 如果你在启动时设置了不一致的
lower_case_table_names
值,MySQL 5.7 可能会在日志中记录警告信息。 - MySQL 8.0: MySQL 8.0 在这方面更为严格,不仅会记录警告信息,还可能直接拒绝启动,直到你解决配置不一致的问题。
- MySQL 5.7 : 如果你在启动时设置了不一致的
示例配置
MySQL 5.7
ini
[mysqld]
# 其他配置项...
lower_case_table_names=1
MySQL 8.0
ini
[mysqld]
# 其他配置项...
lower_case_table_names=1
重启服务
在 Linux 上
sh
sudo systemctl restart mysql
或者
sh
sudo service mysql restart
在 Windows 上
- 打开"服务"管理器:
- 按
Win + R
,输入services.msc
,然后按回车。
- 按
- 找到 MySQL 服务(例如
MySQL80
或MySQL57
)。 - 右键点击该服务,选择"重启"。
验证设置
sql
SHOW VARIABLES LIKE 'lower_case_table_names';
注意事项
- 数据迁移 :
- 特别是在从 MySQL 5.7 升级到 MySQL 8.0 时,确保
lower_case_table_names
设置一致,以避免潜在的数据损坏或不一致问题。
- 特别是在从 MySQL 5.7 升级到 MySQL 8.0 时,确保
- 一致性 :
- 在所有环境中保持一致的
lower_case_table_names
设置,以避免因环境不同而导致的问题。
- 在所有环境中保持一致的
通过以上步骤,你可以成功设置 lower_case_table_names
参数,并确保在 MySQL 5.7 和 MySQL 8.0 中的行为符合你的需求。