MySQL 中的某些物件,包括資料庫、資料表、索引、欄位、別名、檢視、預存程序、分割區、表格空間、資源群組和其他物件名稱,稱為識別碼。本節描述 MySQL 中識別碼的允許語法。第 11.2.1 節「識別碼長度限制」指出每種識別碼類型的最大長度。第 11.2.3 節「識別碼大小寫敏感度」描述哪些類型的識別碼區分大小寫以及在什麼條件下區分大小寫。
識別碼可以加上引號或不加引號。如果識別碼包含特殊字元或為保留字,則每當您引用它時,必須加上引號。(例外:限定名稱中句點後面的保留字必須是識別碼,因此不需要加上引號。)保留字列於第 11.3 節「關鍵字與保留字」。
在內部,識別碼會轉換為 Unicode (UTF-8) 並儲存為 Unicode (UTF-8)。識別碼中允許的 Unicode 字元是基本多語文字面 (BMP) 中的字元。不允許使用補充字元。因此,識別碼可以包含以下字元:
未加引號的識別碼中允許的字元
ASCII:[0-9,a-z,A-Z$_] (基本拉丁字母、數字 0-9、美元符號、底線)
擴充:U+0080 .. U+FFFF
加引號的識別碼中允許的字元包括完整的 Unicode 基本多語文字面 (BMP),但 U+0000 除外
ASCII:U+0001 .. U+007F
擴充:U+0080 .. U+FFFF
ASCII NUL (U+0000) 和補充字元 (U+10000 及更高) 不允許在加引號或未加引號的識別碼中使用。
識別碼可以數字開頭,但除非加上引號,否則不能僅由數字組成。
資料庫、資料表和欄位名稱不能以空格字元結尾。
不建議使用美元符號作為未加引號的資料庫、資料表、檢視、欄位、預存程式或別名的第一個字元,包括與限定詞一起使用的名稱(請參閱第 11.2.2 節「識別碼限定詞」)。以美元符號開頭的未加引號的識別碼不能包含任何其他美元符號字元。否則,允許使用開頭的美元符號,但會觸發棄用警告。
當根據本節稍後給出的規則加上引號時,美元符號仍然可以用作此類識別碼的開頭字元,而不會產生警告。
識別碼引號字元是反引號 (`
)
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
如果啟用 ANSI_QUOTES
SQL 模式,也允許在雙引號內引用識別碼
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
ANSI_QUOTES
模式會導致伺服器將雙引號字串解譯為識別碼。因此,當啟用此模式時,字串常值必須以單引號括住。它們不能以雙引號括住。伺服器 SQL 模式如第 7.1.11 節「伺服器 SQL 模式」中所述控制。
如果您引用識別碼,則識別碼引號字元可以包含在識別碼中。如果要包含在識別碼中的字元與用於引用識別碼本身的字元相同,則需要將該字元加倍。以下陳述式建立一個名為 a`b
的資料表,其中包含一個名為 c"d
的欄位
mysql> CREATE TABLE `a``b` (`c"d` INT);
在查詢的選取清單中,可以使用識別碼或字串引號字元指定帶引號的欄位別名
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
| 1 | 2 |
+-----+-----+
在陳述式的其他地方,對別名的帶引號參考必須使用識別碼引號,否則該參考會被視為字串常值。
建議您不要使用以
或 M
e
開頭的名稱,其中 M
eN
M
和 N
是整數。例如,避免使用 1e
作為識別碼,因為諸如 1e+3
之類的運算式含糊不清。根據上下文,它可能被解釋為運算式 1e + 3
或數字 1e+3
。
使用 MD5()
產生資料表名稱時要小心,因為它可能會產生不合法或含糊不清的格式,例如剛才描述的格式。
也建議您不要使用以 !hidden!
開頭的欄位名稱,以確保新名稱不會與現有隱藏欄位用於功能索引的名稱衝突。
使用者變數不能在 SQL 陳述式中直接用作識別碼或作為識別碼的一部分。請參閱第 11.4 節「使用者自訂變數」,以取得更多資訊和解決方法的範例。
資料庫和資料表名稱中的特殊字元會以對應的檔案系統名稱進行編碼,如第 11.2.4 節「識別碼對應至檔案名稱」中所述。