lower_case_table_names必须在首次初始化前配置,运行中不可修改;因其值固化于数据字典,启动时校验磁盘文件名与元数据一致性,不匹配则启动失败或报错。

必须在 MySQL 数据目录首次初始化前设好 lower_case_table_names,否则改了也白改,还可能启动失败。
为什么运行中不能改 lower_case_table_names
这个参数是只读的,MySQL 启动时会校验磁盘上表文件名和数据字典是否匹配。如果已有 UserOrder 表(对应磁盘文件 UserOrder.frm),再强行配 lower_case_table_names=1,mysqld 会拒绝启动,报错类似 Incorrect definition of table mysql.db 或静默退出。
-
SET GLOBAL lower_case_table_names = 1必报ERROR 1238,无效 -
SHOW VARIABLES LIKE 'lower_case_table_names'查到的是启动时加载的值,不是当前运行时可变的 - 云数据库(如阿里云 RDS、腾讯云 CDB)通常锁定为
1,控制台里根本不可修改
Linux 上新装 MySQL 必须手动加配置
Linux 默认 lower_case_table_names=0(区分大小写),但多数应用代码不关心大小写,一迁就炸。安全做法是在第一次启动前写死配置:
- 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf - 在
[mysqld]段下添加:lower_case_table_names=1 - 确认 MySQL 完全停止:
systemctl is-active mysql返回inactive - 删掉旧数据目录(如
/var/lib/mysql)——这是关键,否则不算“首次初始化” - 再
systemctl start mysql,启动后执行SELECT @@lower_case_table_names;验证返回1
已有数据的实例怎么救?只能重命名或适配代码
如果 MySQL 已跑了一年,表名五花八门(UserOrder、userorder、USERORDER),又不能停机重建,那就别碰 lower_case_table_names:
- 用
RENAME TABLE统一转成小写:RENAME TABLE UserOrder TO userorder; - 检查所有 SQL 语句、ORM 映射、建表脚本,确保表名全小写(比如
CREATE TABLE userorder (...)) - 导出时用
mysqldump --skip-set-charset --default-character-set=utf8mb4,避免字符集干扰导致表名被意外转义 - 若用 Docker,
my.cnf必须挂载进容器且在mysqld启动前生效,仅改宿主机配置没用
最常被忽略的一点:MacOS 默认 lower_case_table_names=2,Windows 是 1,Linux 是 0;三者混用时,2 和 1 表现接近(都不区分大小写),但 2 仍按原大小写存文件,1 强制存小写——这意味着从 Mac 导出的 dump 在 Linux + lower_case_table_names=1 环境下导入,若没提前统一表名,照样找不到表。


















