本文为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)