标识符命名规则
数据库、表、索引、字段、别名、视图、存储过程、触发器、事件、变量分区、表空间、保存点、标签、用户、角色,都是常见的 标识符,它们都有特定的命名规则。
标识符可以使用反引号字符`
引起来。将标识符使用引号引用是可选的,除非标识符中包含特殊字符或保留关键字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_MODE为ANSI_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)