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 中的行为符合你的需求。

相关推荐
牛奶咖啡132 小时前
MySQL InnoDB Cluster 高可用集群部署与应用实践(下)
数据库·mysql·innodb cluster·mysql router·mysql路由的安装部署·mysql路由的测试·mgr组复制
冻咸鱼10 小时前
MySQL的配置
mysql·配置
虚行13 小时前
Mysql 数据同步中间件 对比
数据库·mysql·中间件
奥尔特星云大使13 小时前
mysql读写分离中间件Atlas安装部署及使用
数据库·mysql·中间件·读写分离·atlas
牛马baby13 小时前
【mysql】in 用到索引了吗?
数据库·mysql·in
-Xie-13 小时前
Mysql杂志(三十)——索引失效情况
数据库·mysql
冼紫菜13 小时前
[特殊字符] 深入理解 PageHelper 分页原理:从 startPage 到 SQL 改写全过程
java·后端·sql·mysql·spring
程序新视界13 小时前
什么是MySQL分区?
数据库·mysql·dba
程序新视界13 小时前
实战技巧:使用冗余查询条件解锁MySQL中的索引
数据库·mysql·dba
专注写bug15 小时前
Springboot——使用shyiko监听mysql的bin-log
mysql·binlog