mysqldump: Got error: 1066: Not unique table/alias: 't' when doing LOCK TABL

原文鏈接:http://www.lovean.com/view-34-318002-0.html

在 MySQL 中, 數據庫對應於數據目錄中的目錄。數據庫中的每個表對應於數據庫目錄中至少一個文件 (可能更多, 具體取決於存儲引擎)。觸發器也對應於文件。因此, 底層操作系統的區分大小寫在數據庫、表和觸發器名稱的大小寫敏感度方面起着重要作用。這意味着這些名稱在 Windows 中不區分大小寫, 但在大多數類型的 Unix 中都是區分大小寫的。一個顯著的例外是 macOS, 它是基於 Unix 的, 但使用的是不區分大小寫的默認文件系統類型 (HFS+)。但是, macOS 還支持 UFS 卷, 它們與任何 Unix 一樣都是區分大小寫的。參見1.8.1 節, “MySQL Extensions to Standard SQL“。lower_case_table_names 系統變量還影響服務器處理標識符大小寫靈敏度的方式, 如本節後面所述。

 Linux系統:

數據庫名與表名是嚴格區分大小寫的;
表的別名是嚴格區分大小寫的;
列名與列的別名在所有的情況下均是忽略大小寫的;
變量名也是嚴格區分大小寫的;

mysql> show variables like 'lower_case_table_names';
+------------------------+-------+
| Variable_name     | Value |
+------------------------+-------+
| lower_case_table_names | 0   |
+------------------------+-------+
1 row in set (0.00 sec)
mysql> 
mysql> use mydb;
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.07 sec)
mysql> create table TEST(id int);
Query OK, 0 rows affected (0.09 sec)
mysql> insert into test values(1);
Query OK, 1 row affected (0.03 sec)
mysql> insert into TEST value(2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+
| id  |
+------+
|  1 |
+------+
1 row in set (0.00 sec)
mysql> select * from TEST;
+------+
| id  |
+------+
|  2 |
+------+
1 row in set (0.00 sec)
mysql>


在配置文件my.cnf中設置lower_case_table_names=1後

 

可以看到此時不管是test、TEST抑或Test,都是訪問的test,此時不能訪問”TEST”表了,系統變量lower_case_table_names是隻讀變量,也無法在當前會話修改,這種設置下,如果存在相同的表名的話,使用mysqldump備份數據庫時會遇到下面錯誤:

mysqldump: Got error: 1066: Not unique table/alias: ‘test' when using LOCK TABLES

遇到這種情況就比較麻煩了,必須在配置文件my.cnf中設置變量lower_case_table_names=0,重啓MySQL服務,所以提前規劃,使用統一的命名規則就非常重要,可以避免這樣的問題出現。另外系統變量lower_case_table_names有三個值:分別是0、1、2.

1. 設置成0:表名按你寫的SQL大小寫存儲,大寫就大寫小寫就小寫,比較時大小寫敏感。

2. 設置成1:表名轉小寫後存儲到硬盤,比較時大小寫不敏感。 

3. 設置成2:表名按你寫的SQL大小寫存儲,大寫就大寫小寫就小寫,比較時統一轉小寫比較。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章