lower_case_table_names参数控制数据库和表的大小写敏感性,这个参数的设置会影响数据库对象(如数据库名、表名、列名等)在存储和比较时是否区分大小写。
注意:lower_case_table_names参数在MySQL8.0及之后的版本中,要在初始化数据库时有效。
MySQL8.4官方参考手册:https://dev.mysql.com/doc/refman/8.4/en/identifier-case-sensitivity.html
lower_case_table_names = 0
表名区分大小写,这是Unix/Linux系统中的默认值。
例如,Whsir和whsir被认为是两个不同的表。
环境验证:当lower_case_table_names = 0我们在数据库中创建表并查询。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
mysql> create database demo; mysql> use demo; Database changed mysql> show variables like 'lower_case_table_names'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_table_names | 0 | +------------------------+-------+ 1 row in set (0.01 sec) mysql> CREATE TABLE Whsir ( id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255)); mysql> CREATE TABLE whsir ( id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255)); mysql> show tables; +----------------+ | Tables_in_demo | +----------------+ | Whsir | | whsir | +----------------+ 2 rows in set (0.00 sec) mysql> SHOW TABLES LIKE 'whsir'; +------------------------+ | Tables_in_demo (whsir) | +------------------------+ | whsir | +------------------------+ 1 row in set (0.00 sec) mysql> SHOW TABLES LIKE 'Whsir'; +------------------------+ | Tables_in_demo (Whsir) | +------------------------+ | Whsir | +------------------------+ 1 row in set (0.00 sec) |
通过这个例子我们可以发现,Whsir和whsir被认为是不同的表。
lower_case_table_names = 1
表名不区分大小写,但存储在磁盘上的表名是小写的,这是Windows系统中的默认值。
例如,whsirA和whsira被认为是同一个表,并且在磁盘上存储为whsir。
环境验证:当lower_case_table_names = 1我们在数据库中创建表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mysql> use demo; Database changed mysql> show variables like 'lower_case_table_names'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_table_names | 1 | +------------------------+-------+ 1 row in set (0.01 sec) mysql> CREATE TABLE whsirA ( id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255)); Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE whsira ( id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255)); ERROR 1050 (42S01): Table 'whsira' already exists mysql> SHOW TABLES LIKE 'whsir'; +------------------------+ | Tables_in_demo (whsir) | +------------------------+ | Whsir | | whsir | +------------------------+ 2 rows in set (0.00 sec) |
通过这个例子我们可以发现,whsirA和whsira大小写不同,但是被认为是相同的表。当lower_case_table_names = 1时,可以同时查找到Whsir和whsir。
lower_case_table_names = 2
表名不区分大小写,存储在磁盘上的表名保持其创建时的大小写,这是macOS的默认值。
例如,whsirB和whsirb被认为是同一个表,但在磁盘上可以分别存储为whsirB和whsirb。
注意事项
1、跨平台兼容性:在跨平台开发时,特别是从Windows迁移到Unix/Linux或反之,必须特别注意lower_case_table_names参数的设置,以避免因大小写敏感性不同导致的数据库对象访问问题。
2、现有数据库的调整:如果需要更改现有数据库的lower_case_table_names参数值,可能需要对现有的表和数据库名称进行调整。通常需要导出数据库、手动修改表名并重新导入数据库,对于现有投产的数据库应谨慎操作。
3、统一开发环境:为了避免在开发和生产环境中出现不一致的问题,建议在所有开发和生产环境中统一设置lower_case_table_names参数值。
4、初始化:如果使用的是基于wlnmp源安装的wmysql8或8.4版本,请在数据库停止的状态下修改my.cnf配置文件,使lower_case_table_names = 1(如果不存在该参数,自行手动添加),然后删除/data/mysql目录中的内容(如已投产注意备份,该目录删除后,所有MySQL数据丢失),执行/usr/local/mysql/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/data/mysql/ --user=mysql重新初始化。
总结
正确配置lower_case_table_names参数对于确保数据库在不同操作系统上的一致性和正常运行至关重要。特别是在跨平台开发和部署时,统一的设置可以避免许多潜在的问题。
附,MySQL my.cnf配置文件生成器:https://dbcnf.wlnmp.com/
原文链接:MySQL lower_case_table_names参数介绍,转载请注明来源!