MySQL 5.7 和 MySQL 8.0 小写敏感性的设置比较

MySQL 5.7 和 MySQL 8.0 在处理大小写敏感性方面有一些差异,这些差异主要体现在操作系统、配置文件和数据库对象名称的处理上。

操作系统的影响

  • Windows:

    • 在 Windows 上,默认情况下,MySQL 对表名和数据库名是不区分大小写的。
    • 这是因为 Windows 文件系统本身是不区分大小写的。
  • Unix/Linux:

    • 在 Unix 和 Linux 系统上,默认情况下,MySQL 对表名和数据库名是区分大小写的。
    • 这是因为 Unix 和 Linux 文件系统是区分大小写的。

配置文件设置

可以通过 my.cnfmy.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,区分大小写。
  • 配置选项:

    • 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 参数的基本步骤是相似的,但在一些细节和行为上存在一些差异。

共同点

  1. 配置文件:

    • 在两个版本中,你都需要编辑 MySQL 的配置文件(通常是 my.cnfmy.ini)。
    • 配置项的位置通常在 [mysqld] 部分。
  2. 参数值:

    • lower_case_table_names=0:表名按照创建时指定的大小写存储(区分大小写)。
    • lower_case_table_names=1:表名在存储时转换为小写(不区分大小写)。
    • lower_case_table_names=2:表名按照创建时指定的大小写存储,但比较操作时不区分大小写。
  3. 重启服务:

    • 在两个版本中,修改配置后都需要重启 MySQL 服务以使更改生效。

区别

  1. 默认值:

    • MySQL 5.7 : 默认值取决于操作系统。在 Unix 系统上,默认值是 0;在 Windows 上,默认值是 1
    • MySQL 8.0 : 默认值也取决于操作系统。在 Unix 系统上,默认值是 0;在 Windows 上,默认值是 1。但 MySQL 8.0 引入了更多的平台一致性检查,确保在不同平台上的一致性。
  2. 平台一致性:

    • 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 可能会更严格地拒绝这种操作,以防止潜在的数据损坏。
  3. 初始化过程:

    • MySQL 5.7 : 初始化过程中,lower_case_table_names 参数的设置会影响数据目录的结构,但不会阻止初始化过程。
    • MySQL 8.0 : MySQL 8.0 在初始化过程中对 lower_case_table_names 参数的设置更为严格。如果你试图在一个已经使用不同 lower_case_table_names 设置的数据目录上启动 MySQL 8.0,可能会遇到错误。这有助于防止数据损坏和不一致。
  4. 日志和警告:

    • MySQL 5.7 : 如果你在启动时设置了不一致的 lower_case_table_names 值,MySQL 5.7 可能会在日志中记录警告信息。
    • MySQL 8.0: MySQL 8.0 在这方面更为严格,不仅会记录警告信息,还可能直接拒绝启动,直到你解决配置不一致的问题。

示例配置

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 服务(例如 MySQL80MySQL57)。
  • 右键点击该服务,选择"重启"。

验证设置

sql 复制代码
SHOW VARIABLES LIKE 'lower_case_table_names';

注意事项

  • 数据迁移 :
    • 特别是在从 MySQL 5.7 升级到 MySQL 8.0 时,确保 lower_case_table_names 设置一致,以避免潜在的数据损坏或不一致问题。
  • 一致性 :
    • 在所有环境中保持一致的 lower_case_table_names 设置,以避免因环境不同而导致的问题。

通过以上步骤,你可以成功设置 lower_case_table_names 参数,并确保在 MySQL 5.7 和 MySQL 8.0 中的行为符合你的需求。

相关推荐
White_Mountain2 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
老王笔记2 小时前
GTID下复制问题和解决
mysql
Lojarro4 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
TianyaOAO4 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong4 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
W21556 小时前
Liunx下MySQL:表的约束
数据库·mysql
nbsaas-boot7 小时前
探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
数据库·mysql·json
奥顺7 小时前
PHPUnit使用指南:编写高效的单元测试
大数据·mysql·开源·php
苹果醋39 小时前
SpringBoot快速入门
java·运维·spring boot·mysql·nginx
ROCKY_8179 小时前
Mysql复习(一)
数据库·mysql