本文為mariadb官方手冊:Identifier Names的譯文。 原文:https://mariadb.com/kb/en/library/identifier-names/我提交到MariaDB官方手冊的譯文:https://mariadb.com/kb/zh-cn/library/iden ...
本文為mariadb官方手冊:Identifier Names的譯文。
原文:https://mariadb.com/kb/en/library/identifier-names/
我提交到MariaDB官方手冊的譯文:https://mariadb.com/kb/zh-cn/library/identifier-names/
Identifier Names
資料庫、表、索引、欄位、別名、視圖、存儲過程、觸發器、事件、變數分區、表空間、保存點、標簽、用戶、角色,都是常見的 標識符,它們都有特定的命名規則。
標識符可以使用反引號字元"`"引起來。將標識符使用引號引用是可選的,除非標識符中包含特殊字元或保留關鍵字。如果將SQL_MODE設置為ANSI_QUOTES,則雙引號(")也可以用來引用標識符。
使用全名(fully qualified names)的時候無需引號引用標識符,即使名稱中使用了保留關鍵字。例如,test.select只有一種解釋,因此沒有使用引號將保留字"select"包圍時也能正確解析。
無需引用的情況
下麵的字元都是有效的,它們不需要被引號引用:
- ASCII: [0-9,a-z,A-Z$_] (數值0-9,大小寫的拉丁字元,美元符號,下劃線)
- Extended: U+0080 .. U+FFFF
需要引用的情況
下麵的字元是有效的,但是需要被引號引用:
- ASCII: U+0001 .. U+007F (full Unicode Basic Multilingual Plane (BMP) except for U+0000)
- Extended: U+0080 .. U+FFFF
- 標識符自身也可以作為標識符的一部分,只要它們被引號引用即可。
其他命名規則
以下是標識符命名相關的其他規則:
- 標識符以Unicode(UTF-8)格式存儲。
- 標識符可能會也可能不會區分大小寫。見Indentifier Case-sensitivity。
- 資料庫、表和欄位名稱不能以空白字元結尾。
- 標識符名稱可以以數值開頭,但不能只包含數值,除非使用引號引用。
- 以數值開頭且後面跟字元"e"的標識符,需要使用引號引用,它們會被解析為浮點數值。
- 標識符中不允許包含ASCII NUL(U+0000)字元和增補字元(U+10000或更大的值)。
- 允許使用類似5e6、9e這樣的標識符,但強烈建議不要使用它們,因為在特定的上下文中,它們會產生歧義而被當作一個數值或表達式。
- 用戶變數不能作為標識符的一部分,也不能直接作為SQL語句中的標識符。
引用字元
普通的引用字元使用的是反引號"`",但如果設置SQL_MODE為ANSI_QUOTES,則雙引號(")也可作為引用字元。
反引號可以作為標識符的一部分,但此時它需要被引用起來。引用字元可以是反引號,但這種情況下,反引號必須使用另一個反引號進行轉義。
最大長度
- Databases, tables, columns, indexes, constraints, stored routines, triggers, events, views, tablespaces, servers和log file groups 最大允許64個字元。
- 組合語句標簽最大允許16個字元。
- 別名最大允許256個字元。但CREATE VIEW語句中的欄位別名最大允許64個字元(而非最大別名長度256字元)。
- Users最大長度80個字元。
- Roles最大長度128個字元。
- 多位元組字元不會計算超出字元長度限制之外的字元。
組合標識符
MariaDB允許使用單個欄位名稱來引用某個欄位,只要它不會產生歧義,或者為欄位指定表名,再或者加上資料庫名使用3段標識符的方式來引用欄位。使用句點(.)分隔各標識符,分隔符句點(.)前後可以包含空格(製表符、換行符)。
示例
使用句點分隔各標識符:
CREATE TABLE t1 (i int);
INSERT INTO t1(i) VALUES (10);
SELECT i FROM t1;
+------+
| i |
+------+
| 10 |
+------+
SELECT t1.i FROM t1;
+------+
| i |
+------+
| 10 |
+------+
SELECT test.t1.i FROM t1;
+------+
| i |
+------+
| 10 |
+------+
句點可以被空格分隔:
SELECT test . t1 . i FROM t1;
+------+
| i |
+------+
| 10 |
+------+
解決歧義:
CREATE TABLE t2 (i int);
SELECT i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;
ERROR 1052 (23000): Column 'i' in field list is ambiguous
SELECT t1.i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;
+------+
| i |
+------+
| 10 |
+------+
創建一個需要被引號引用的表:
CREATE TABLE 123% (i int);
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax
to use near '123% (i int)' at line 1
CREATE TABLE `123%` (i int);
Query OK, 0 rows affected (0.85 sec)
CREATE TABLE `TABLE` (i int);
Query OK, 0 rows affected (0.36 sec)
使用雙引號作為引用字元:
CREATE TABLE "SELECT" (i int);
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax
to use near '"SELECT" (i int)' at line 1
SET sql_mode='ANSI_QUOTES';
Query OK, 0 rows affected (0.03 sec)
CREATE TABLE "SELECT" (i int);
Query OK, 0 rows affected (0.46 sec)
將引用符號作為標識符名稱的一部分:
SHOW VARIABLES LIKE 'sql_mode';
+---------------+-------------+
| Variable_name | Value |
+---------------+-------------+
| sql_mode | ANSI_QUOTES |
+---------------+-------------+
CREATE TABLE "fg`d" (i int);
Query OK, 0 rows affected (0.34 sec)
創建名為"*"的表(Unicode number: U+002A),它需要被引用起來。
CREATE TABLE `*` (a INT);
浮點數歧義:
CREATE TABLE 8984444cce5d (x INT);
Query OK, 0 rows affected (0.38 sec)
CREATE TABLE 8981e56cce5d (x INT);
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax
to use near '8981e56cce5d (x INT)' at line 1
CREATE TABLE `8981e56cce5d` (x INT);
Query OK, 0 rows affected (0.39 sec)