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

相关推荐
程序员爱钓鱼7 分钟前
Go 语言高效连接 MySQL 数据库:从入门到实战
后端·mysql·go
白熊一号36 分钟前
Hi, DeepSeek 带我通过实战学习SQL入门知识
sql·mysql
Linux运维老纪2 小时前
Python实战项目(‌Hands-on Python Project)
开发语言·数据库·python·sql·mysql·云计算·运维开发
小林熬夜学编程3 小时前
【MySQL】第十五弹---全面解析事务:定义、起源、版本支持与提交方式
android·linux·服务器·开发语言·数据库·mysql
计算机学姐5 小时前
基于Asp.net的驾校管理系统
vue.js·后端·mysql·sqlserver·c#·asp.net·.netcore
马剑威(威哥爱编程)5 小时前
C语言操作MySQL从入门到精通
c语言·mysql·adb
明矾java9 小时前
MySQL进阶-关联查询优化
数据库·mysql
冰糖码奇朵9 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
迷路的小犀牛9 小时前
【MYSQL数据库异常处理】执行SQL语句报超时异常
数据库·sql·mysql