lower_case_table_names 必须在首次初始化时设定且不可更改——mysql 8.0 将其固化于数据字典(mysql.ibd),重启或修改 my.cnf 均无效;若需设为 0,须在空 datadir 下用 --lower-case-table-names=0 显式初始化。

lower_case_table_names 必须在首次初始化时决定,之后无法修改 —— 这不是配置遗漏或重启没生效,而是 MySQL 8.0 数据字典的硬性限制。
为什么改了 my.cnf 重启也不生效?
因为 MySQL 8.0 把元数据(包括所有表名的规范形式)直接写进了 mysql.ibd 系统表空间。一旦 mysqld --initialize 执行完成,lower_case_table_names 的值就固化进数据字典。后续启动时会校验:磁盘上实际的文件名(如 user_info.frm)是否与字典里记录的“规范名”一致。不一致就直接拒绝加载,日志里明确报错:lower_case_table_names value mismatch 或 Data Dictionary initialization failed。
想初始化时设为区分大小写(lower_case_table_names=0),必须这样做
仅适用于全新部署、/var/lib/mysql 目录为空、尚未执行过任何初始化的环境:
-
mysqld初始化命令必须显式带参数:mysqld --user=mysql --initialize --lower-case-table-names=0 --basedir=/usr --datadir=/var/lib/mysql(注意是双横线--lower-case-table-names,不是下划线) - 不能只在
my.cnf里写lower_case_table_names=0—— 初始化阶段不读该配置 - 初始化前务必确认
/var/lib/mysql下无残留文件(尤其是ibdata1、mysql.ibd、sys目录等) - 初始化成功后,再在
my.cnf的[mysqld]段落补上lower_case_table_names=0,确保服务重启时参数一致
误初始化成 1 或 2 后想改回 0,没有绕过办法
Linux 默认初始化值其实是 0,但如果你已在 Windows/macOS 上初始化过、或手动指定过 --lower-case-table-names=1,那现在想切回区分大小写,只能:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 停服务:
systemctl stop mysqld - 彻底清空
datadir(如/var/lib/mysql),备份仅限业务数据(用mysqldump导出 SQL,不要直接拷贝文件) - 用带
--lower-case-table-names=0的命令重新初始化 - 导入备份数据(注意:原表名若含大写,
mysqldump生成的 SQL 默认用反引号包裹,导入时能保留大小写)
字段值大小写敏感是另一回事,别和 lower_case_table_names 混了
表名是否区分大小写,由 lower_case_table_names 控制;而字段内容是否区分大小写,取决于列的 COLLATION。比如:
-
VARCHAR(50) COLLATE utf8mb4_0900_as_cs→ 区分大小写 -
VARCHAR(50) COLLATE utf8mb4_0900_as_ci→ 不区分 - 建表时不显式指定,就继承表或数据库默认校对规则
这个可以随时改,不影响服务启动,也无需重初始化。
关键点在于:表名大小写的开关是一次性决策,不是运行期配置项。初始化那条命令敲下去,就定死了。










