9.2 架构对象名称
MySQL 中的某些对象,包括数据库,table,索引,列,别名,视图,存储过程,分区,table 空间和其他对象名,称为标识符。本节描述了 MySQL 中标识符的允许语法。 第 9.2.1 节“标识符长度限制”,table 示每种标识符的最大长度。 第 9.2.3 节“标识符区分大小写”描述了哪些类型的标识符区分大小写以及在什么情况下。
标识符可以带引号或不带引号。如果标识符包含特殊字符或为保留字,则在引用它时必须*引用它。 (exception:限定名称中句点后的保留字必须是标识符,因此不必加引号.)保留字在第 9.3 节“关键字和保留字”处列出。
在内部,标识符将转换为 Unicode(UTF-8)并存储为 Unicode(UTF-8)。标识符中允许的 Unicode 字符是基本多语言平面(BMP)中的字符。不允许使用补充字符。因此,标识符可能包含以下字符:
-
未加引号的标识符中允许的字符:
-
ASCII:0-9,a-z,A-Z $ _
- 扩展:U 0080 .. U FFFF
-
带引号的标识符中允许的字符包括完整的 Unicode 基本多语言平面(BMP),但 U 0000 除外:
-
ASCII:U 0001 .. U 007F
- 扩展:U 0080 .. U FFFF
-
带引号或不带引号的标识符中不允许使用 ASCII NUL(U 0000)和补充字符(U 10000 及更高版本)。
-
标识符可以以数字开头,但除非加引号,否则不能仅由数字组成。
-
数据库,table 和列的名称不能以空格字符结尾。
标识符引号是反引号(```''):
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模式使服务器将双引号字符串解释为标识符。因此,启用此模式后,字符串 Literals 必须用单引号引起来。它们不能用双引号引起来。如第 5.1.10 节“服务器 SQL 模式”中所述控制服务器 SQL 模式。
如果您引用标识符,则标识符引用字符可以包含在标识符中。如果要包含在标识符中的字符与用于引用标识符本身的字符相同,则需要将该字符加倍。以下语句创建一个名为a
b的 table,该 table 包含一个名为
c"d`的列:
mysql> CREATE TABLE `a``b` (`c"d` INT);
在查询的选择列 table 中,可以使用标识符或字符串引号指定带引号的列别名:
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
| 1 | 2 |
+-----+-----+
在语句的其他地方,带引号的别名引用必须使用标识符引号,否则该引用将被视为字符串 Literals。
建议您不要使用以Me
或MeN
开头的名称,其中* M
和 N
*是整数。例如,避免使用1e
作为标识符,因为诸如1e+3
之类的 table 达式不明确。根据上下文,它可能会解释为 table 达式1e + 3
或数字1e+3
。
使用MD5()产生 table 名时要小心,因为它会产生非法或歧义格式的名称,例如刚刚描述的格式。
用户变量不能直接在 SQL 语句中用作标识符或标识符的一部分。有关更多信息和解决方法示例,请参见第 9.4 节“用户定义的变量”。
数据库名称和 table 名称中的特殊字符编码为相应的文件系统名称,如第 9.2.4 节“将标识符 Map 到文件名”中所述。如果您有来自旧版本 MySQL 的数据库或 table,其中包含特殊字符,而其基础目录名称或文件名尚未更新为使用新编码,则服务器将显示其名称,并以#mysql50#
作为前缀。有关引用此类名称或将其转换为较新的编码的信息,请参见该部分。