标识符命名规则

数据库、表、索引、字段、别名、视图、存储过程、触发器、事件、变量分区、表空间、保存点、标签、用户、角色,都是常见的 标识符,它们都有特定的命名规则。

标识符可以使用反引号字符`引起来。将标识符使用引号引用是可选的,除非标识符中包含特殊字符或保留关键字reserved word。如果将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_MODEANSI_QUOTES,则双引号(")也可作为引用字符。

反引号可以作为标识符的一部分,但此时它需要被引用起来。引用字符可以是反引号,但这种情况下,反引号必须使用另一个反引号进行转义。

最大长度

  • Databases, tables, columns, indexes, constraints, stored routines, triggers, events, views, tablespaces, servers和log file groups 最大允许64个字符。
  • 组合语句labels最大允许16个字符。
  • 别名最大允许256个字符。但CREATE VIEW语句中的字段别名最大允许64个字符(而非最大别名长度256字符)。
  • Users最大长度80个字符。
  • Roles最大长度128个字符。
  • 多字节字符不会计算超出字符长度限制之外的字符。

组合标识符

MariaDB允许使用单个字段名称来引用某个字段,只要它不会产生歧义,或者为字段指定表名,再或者加上数据库名使用3段标识符的方式来引用字段。使用句点(.)分隔各标识符,分隔符句点(.)前后可以包含空格(制表符、换行符)。

示例

使用句点分隔各标识符:

MariaDB [test]> 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)

使用双引号作为引用字符: Using double quotes as a quoting character:

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)

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.