必须清空datadir后设lower_case_table_names=1并重新初始化,否则mysql 8.0+因数据字典与文件名大小写不一致直接启动失败;5.7虽能启动但旧表访问异常,lower_case_table_names=2在linux下被ext4无视而静默还原为0。

Linux 下 MySQL 默认区分表名大小写,想让它不区分,lower_case_table_names=1 是唯一有效配置,但不能直接加完就重启——运行中的库硬改会启动失败、丢表。
为什么改了配置重启后 lower_case_table_names 还是 0
不是配置没生效,而是 MySQL 8.0+ 启动时强制校验:如果数据目录(如 /var/lib/mysql/)里已有表文件(比如 Users.frm、orders.ibd),而新配置要求全小写(users.frm),它直接 abort,日志只报 “Can’t start server: failed to initialize databases”。MySQL 5.7 虽允许启动,但已有大小写混用的表(如同时存在 User 和 user)会导致 mysqldump 恢复漏表或覆盖。
lower_case_table_names=2 在 Linux 上根本无效
设成 2 看似“建表保留原样、查时不区分”,实则被 ext4 文件系统无视——Linux 启动时会静默重置为 0。即使在 macOS 上启用,也会出现:
-
CREATE TABLE User和CREATE TABLE user都成功,但实际只生成一个user.frm - 第二次建表 silently 覆盖第一次,无报错、无日志
- 应用里混用
SELECT FROM user和SELECT FROM User,结果随机返回某次建表的数据
安全设成不区分的唯一路径:清空 → 设参 → 重建
适用于新部署或可停机重建的场景,三步缺一不可:
- 停 MySQL:
systemctl stop mysqld - 彻底清空数据目录(不是只删库):
rm -rf /var/lib/mysql/*(注意备份) - 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]下加一行:lower_case_table_names=1 - 初始化新实例:
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql - 启动并导入:
systemctl start mysqld,再用mysql执行 dump 文件
注意:CREATE TABLE 语句里的表名会被原样执行,但 MySQL 内部强制转小写存盘;开发环境若用 Windows(默认 =1),而生产 Linux 保持 =0,SQL 里写 SELECT FROM users 就会报 Table 'db.Users' doesn't exist——这不是语法错,是元数据根本找不到。











