MySQL 8.0 的 lower_case_table_names 初始化后不可修改,因其值已固化进数据字典;必须在首次 mysqld --initialize 时通过命令行参数 --lower-case-table-names 显式指定,否则需清空 datadir 重建。

MySQL 8.0 升级后 lower_case_table_names 无法修改,不是配置没生效,而是根本不可写 —— 该值已在初始化时固化进数据字典,强行改配置重启只会失败。
为什么 SET GLOBAL 或改 my.cnf 后重启无效?
MySQL 8.0 启动时会校验:磁盘上实际的表文件名(如 UserOrder.ibd)是否与数据字典里记录的规范名一致。若不一致,直接拒绝启动,日志中出现类似 Different lower_case_table_names settings for server ('1') and data dictionary ('0') 的错误。
-
lower_case_table_names是只读变量,运行时执行SET GLOBAL lower_case_table_names = 1必报ERROR 1238 - 即使配置文件写了,只要数据目录(
/var/lib/mysql)已存在且含混合大小写表名,MySQL 8.0 就不会加载元数据 - 云数据库(如阿里云 RDS、腾讯云 CDB)在创建后完全锁定该参数,控制台也灰显不可编辑
已有实例想统一为小写(lower_case_table_names=1),只能重初始化
这不是“调整配置”,而是重建兼容性前提。适用于可停服、能清空数据目录的环境:
- 确认 MySQL 已停止:
systemctl is-active mysqld返回inactive - 清空数据目录:
rm -rf /var/lib/mysql/*(RPM 默认路径;Debian 系为/var/lib/mysql) - 在
/etc/my.cnf的[mysqld]段下明确写入:lower_case_table_names=1 - 用命令行参数强制初始化:
mysqld --initialize --lower-case-table-names=1 --user=mysql --datadir=/var/lib/mysql(注意:仅靠配置文件不够,8.0 要求初始化阶段显式传参) - 启动后立即验证:
SHOW VARIABLES LIKE 'lower_case_table_names';返回1才算成功
大写表名怎么迁移到新规则下?RENAME 是唯一可靠方式
配置设成 1 并重启后,只是让后续新建的表自动转小写。已有大写表(如 UserOrder)仍以原名存在于磁盘,MySQL 不会帮你重命名。
- 必须手动执行
RENAME TABLE UserOrder TO userorder;,逐个把表名改成全小写 - 不能依赖
mysqldump导出再导入来“绕过”——导出时它会按当前lower_case_table_names规则生成建表语句,若当前是0,dump 出来的仍是CREATE TABLE UserOrder,导入到1实例会失败 - 检查残留大写名的 SQL:
SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('mysql', 'information_schema') AND table_name != LOWER(table_name);
最易被忽略的一点:Linux 下默认初始化就是 lower_case_table_names=0,所以“保持区分大小写”其实不用动;但一旦误设成 1 或 2,就只能重来——没有安全降级路径,也没有后台自动转换机制。


















