lower_case_table_names必须在首次初始化前通过配置文件设置,运行后不可修改;Linux默认为0(区分大小写),Windows/macOS默认非0,跨平台迁移需提前统一配置,否则启动失败。

初始化时设置 lower_case_table_names 必须在首次启动前完成
MySQL 的 lower_case_table_names 是只读系统变量,**无法在实例运行后修改**。一旦数据目录已初始化(即执行过 mysqld --initialize),再修改该参数会导致启动失败或元数据损坏。所以“初始化时设置”不是可选项,而是唯一安全路径。
- Linux 上默认值为
0,意味着表名严格区分大小写;若你希望跨平台一致(比如开发在 macOS、部署在 Linux),必须在初始化前就设为1或2 - Windows/macOS 虽默认不敏感,但若后续要迁移到 Linux,且已有大写表名(如
UserLog和userlog),不提前统一设置会直接冲突 - MySQL 8.0+ 对该参数校验更严格:若 datadir 已存在且
lower_case_table_names值与初始化时不匹配,服务拒绝启动,并报错Cannot start server with a different lower_case_table_names value
mysqld --initialize 前必须配置好 my.cnf
不能靠启动命令临时传参,--lower-case-table-names=1 这类命令行参数在初始化阶段被忽略。必须将配置写入 MySQL 配置文件,并确保 mysqld 启动时能加载它。
- 配置位置优先级:/etc/my.cnf → /etc/mysql/my.cnf → /usr/etc/my.cnf → ~/.my.cnf;推荐用
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian) - 必须放在
[mysqld]段下,例如:[mysqld] lower_case_table_names = 1
- 确认无拼写错误:
lower_case_table_names中是下划线,不是短横线或驼峰;值只能是0、1或2,不能加引号 - 初始化命令本身不输出警告,但若配置未生效,
SHOW VARIABLES LIKE 'lower_case_table_names';会返回0—— 此时说明配置文件没被读取,需检查mysqld --help --verbose | grep "Default options"确认配置路径
不同操作系统的取值约束不能绕过
MySQL 在启动时会校验 lower_case_table_names 与底层文件系统是否兼容。强行突破限制(比如在 macOS 上设为 0)会导致服务无法启动,或引发 MyISAM 表索引损坏 —— 即使 InnoDB 表看似正常,也不代表安全。
- Linux(ext4/xfs):支持
0、1、2,但设为0后,CREATE TABLE Tbl和CREATE TABLE tbl会被视为两张表,容易引发应用逻辑混乱 - Windows(NTFS):仅允许
1或2;设为0会直接报错lower_case_table_names cannot be set to 0 on this system - macOS(APFS/HFS+):仅允许
1或2;设为0同样启动失败 - 关键点:
lower_case_table_names=2在 macOS 上是“存储原样、比较转小写”,但 InnoDB 实际仍以小写保存表文件 —— 所以SHOW TABLES显示的仍是小写名,只是建表语句里写的大小写会被保留
字段内容大小写敏感和 lower_case_table_names 无关
很多人混淆这个参数的作用范围:lower_case_table_names 只控制数据库名、表名、别名等标识符(identifier)的大小写行为,**完全不影响字段值的比较逻辑**。字段是否区分大小写,由字符集的 collation 决定。
- 例如:
SELECT * FROM user WHERE name = 'Admin'是否匹配'admin',取决于name字段的 collation:若为utf8mb4_general_ci,则匹配;若为utf8mb4_bin,则不匹配 - 想让字段内容大小写敏感,应在建表时指定:
CREATE TABLE user ( name VARCHAR(32) COLLATE utf8mb4_bin );
- 或者用
BINARY强制临时转换:WHERE BINARY name = 'Admin',但注意这会使索引失效,仅适合低频精确匹配 - 切勿试图用
lower_case_table_names解决密码/用户名比对问题 —— 那是字符集 collation 或应用层哈希的事
真正麻烦的是:初始化之后才发现配置错了。这时候没有“热修复”方案,只能导出 SQL(注意 mysqldump --skip-set-charset --compatible=mysql40 避免 collation 冲突)、清空 datadir、重配、重初始化、再导入 —— 所有表名都会被强制转小写,原始大小写信息永久丢失。











