小知識:MySQL修改lower_case_table_names參數


環境:MySQL 5.7.25
起初創建環境時沒有要求表名稱不區分大小寫,后續應用使用提出要設置lower_case_table_names=1的需求,期望表名不再區分大小寫。
修改這個參數需要重啟實例,另外一定要注意該參數修改會導致之前大寫存儲的表將無法識別,需要特殊處理。

1.默認區分大小寫的環境

默認在lower_case_table_names=0的情況下,表名是嚴格區分大小寫的,若查詢時大小寫弄混淆就會直接報錯表不存在,現象如下:
root@mysqldb 12:33:  [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| T1             |
| t2             |
+----------------+
2 rows in set (0.00 sec)

root@mysqldb 12:33:  [test]> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.02 sec)

root@mysqldb 12:34:  [test]> select * from T1;
Empty set (0.00 sec)

root@mysqldb 12:34:  [test]> select * from t2;
Empty set (0.00 sec)

root@mysqldb 12:34:  [test]> select * from t1;
ERROR 1146 (42S02): Table 'test.t1' doesn't exist
root@mysqldb 12:34:  [test]> select * from T2;
ERROR 1146 (42S02): Table 'test.T2' doesn't exist
root@mysqldb 12:34:  [test]> 

2.修改參數lower_case_table_names

在my.cnf配置文件中[mysqld]標簽的作用區域,增加`lower_case_table_names=1`的配置,然后重啟MySQL服務:
service mysqld restart

3.驗證表名區分大小寫情況

重啟實例后,確認參數已修改:
root@mysqldb 12:58:  [test]> show variables like 'lower_case_table_names';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 1     |
+------------------------+-------+
1 row in set (0.00 sec)

發現原表t2,在參數修改后,通過t2和T2都可以訪問,滿足需求。
但是原表T1,在參數修改后,通過t1和T1都無法訪問,細看報錯可以看到無論我們傳入T1還是t1,都是按照小寫的t1來解析。

root@mysqldb 12:46:  [(none)]> use test
Database changed
root@mysqldb 12:46:  [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| T1             |
| t2             |
+----------------+
2 rows in set (0.01 sec)

root@mysqldb 12:46:  [test]> select * from t1;
ERROR 1146 (42S02): Table 'test.t1' doesn't exist
root@mysqldb 12:47:  [test]> select * from T2;
Empty set (0.01 sec)

root@mysqldb 12:47:  [test]> select * from T1;
ERROR 1146 (42S02): Table 'test.t1' doesn't exist
root@mysqldb 12:47:  [test]> select * from t2;
Empty set (0.00 sec)

如果此時應用再重新創建T1表,就會被存儲為小寫的t1:

root@mysqldb 13:03:  [test]> create table T1(id int);
Query OK, 0 rows affected (0.08 sec)

root@mysqldb 13:03:  [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| T1             |
| t1             |
| t2             |
+----------------+
3 rows in set (0.00 sec)

root@mysqldb 13:03:  [test]> select * from T1;
Empty set (0.00 sec)

root@mysqldb 13:03:  [test]> select * from t1;
Empty set (0.00 sec)

至於之前的T1,如果想要清理刪除,可改回lower_case_table_names=0后進行刪除。

總結:如果有不區分大小寫這樣的需求,在建庫配置時就要及早提出,不然后期更改不但要停機,還很可能需要特殊處理。
如果不幸遇到這樣的情況,操作之前先使用mysqldump進行導出備份,然后刪除所有含有大寫的表,成功修改參數后再進行導入即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM