MySQL數(shù)據(jù)庫(kù)在創(chuàng)建表名、列名、索引名等對(duì)象時(shí),默認(rèn)是不區(qū)分大小寫(xiě)的。這就意味著,TABLE_NAME、table_name、Table_Name等都指向同一個(gè)表。
但是,在啟用了lower_case_table_names選項(xiàng)后,將會(huì)出現(xiàn)不同的結(jié)果。
mysql>SHOW VARIABLES LIKE "lower_case_table_names"; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_table_names | 1 | +------------------------+-------+ 1 row in set (0.00 sec)
當(dāng)lower_case_table_names的值為1時(shí),MySQL會(huì)將所有對(duì)象名轉(zhuǎn)化為小寫(xiě),同時(shí)也意味著在創(chuàng)建表名等對(duì)象時(shí)必須使用小寫(xiě)字母。
mysql>CREATE TABLE users( user_id INT, user_name VARCHAR(50), ); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARCHAR(50), )' at line 3
以上代碼在啟用lower_case_table_names=1時(shí)會(huì)報(bào)錯(cuò),因?yàn)閡ser_name這個(gè)列名包含了大寫(xiě)字母。
現(xiàn)在,我們?cè)谠O(shè)置lower_case_table_names為0,再次創(chuàng)建users表,如下所示:
mysql>SET lower_case_table_names=0; Query OK, 0 rows affected (0.00 sec) mysql>CREATE TABLE users( user_id INT, user_name VARCHAR(50), ); Query OK, 0 rows affected (0.14 sec)
這次創(chuàng)建成功了。因?yàn)樵趌ower_case_table_names=0時(shí),MySQL會(huì)區(qū)分大小寫(xiě),所以u(píng)ser_name這個(gè)列名不會(huì)被自動(dòng)轉(zhuǎn)換成小寫(xiě)。
在實(shí)際開(kāi)發(fā)中,我們需要根據(jù)實(shí)際情況來(lái)選擇是否啟用lower_case_table_names。如果數(shù)據(jù)庫(kù)中包含了大量大小寫(xiě)不一致的對(duì)象名,在啟用lower_case_table_names后會(huì)導(dǎo)致同名對(duì)象被覆蓋,造成數(shù)據(jù)的丟失。因此,在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),最好遵循一定的命名規(guī)范,以免出現(xiàn)不必要的麻煩。