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 節,「識別符號到檔案名稱的映射」所述。