在 MySQL 中,lower_case_table_names 系统变量控制表名在磁盘上的存储方式以及 MySQL 如何处理表名的比较。这个设置在不同操作系统之间,尤其是在 Windows 和类 Unix 系统之间移动数据库时,特别重要。

以下是该变量可能的设置值及其影响:

1. lower_case_table_names = 0:

表名按指定的大小写存储,比较时大小写敏感。
适用于类 Unix 系统(如 Linux 和 macOS),这些系统的文件系统是区分大小写的。
如果创建一个名为 MyTable 的表,必须始终以 MyTable 来引用它。

2. lower_case_table_names = 1:

表名在磁盘上以小写形式存储,比较时大小写不敏感。
适用于 Windows 系统,因为 Windows 的文件系统不区分大小写。
如果创建一个名为 MyTable 的表,可以以 mytable、MYTABLE 或任何其他大小写组合来引用它。

3. lower_case_table_names = 2:

表名按指定的大小写存储,但比较时大小写不敏感。
适用于某些类 Unix 系统,在这些系统中,你希望保留表名的大小写,但进行大小写不敏感的比较。
如果创建一个名为 MyTable 的表,可以以 mytable、MYTABLE 等来引用它,但在元数据中保留原始大小写(MyTable)。

注意事项和最佳实践:

  • 跨平台兼容性:如果需要在 Windows 和类 Unix 系统之间移动数据库,最好在所有系统上使用 lower_case_table_names = 1 以确保一致性。
  • 数据库迁移:在创建表后更改 lower_case_table_names 设置可能会导致问题。通常建议在创建任何数据库或表之前设置此变量。
  • 备份和恢复:在具有不同 lower_case_table_names 设置的服务器上恢复备份时要小心。

设置 lower_case_table_names:

要设置 lower_case_table_names,需要在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中进行配置,然后重启 MySQL 服务器。具体步骤如下:

1. 找到你的 MySQL 配置文件:

  • 在类 Unix 系统上:/etc/my.cnf、/etc/mysql/my.cnf 或 /usr/local/etc/my.cnf。
  • 在 Windows 上:C:\ProgramData\MySQL\MySQL Server X.Y\my.ini(X.Y 是版本号)。

2. 编辑配置文件:

在 [mysqld] 部分下添加以下行:

[mysqld]
lower_case_table_names = 1

3. 重启 MySQL 服务器:

  • 在类 Unix 系统上:
sudo systemctl restart mysql
  • 在 Windows 上:
    可以从服务管理控制台重启 MySQL 服务,或者使用命令提示符:
net stop mysql
net start mysql

示例配置:

  • 对于类 Unix 系统,你希望表名不区分大小写:
[mysqld]
lower_case_table_names = 1
  • 对于 Windows 系统(默认不区分大小写):
[mysqld]
lower_case_table_names = 1
  • 对于类 Unix 系统,你希望表名区分大小写:
[mysqld]
lower_case_table_names = 0

确保在创建任何数据库或表之前进行此配置更改,以避免出现问题。