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 模式。

如果您引用标识符,则标识符引用字符可以包含在标识符中。如果要包含在标识符中的字符与用于引用标识符本身的字符相同,则需要将该字符加倍。以下语句创建一个名为ab的 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。

建议您不要使用以MeMeN开头的名称,其中* M N *是整数。例如,避免使用1e作为标识符,因为诸如1e+3之类的 table 达式不明确。根据上下文,它可能会解释为 table 达式1e + 3或数字1e+3

使用MD5()产生 table 名时要小心,因为它会产生非法或歧义格式的名称,例如刚刚描述的格式。

用户变量不能直接在 SQL 语句中用作标识符或标识符的一部分。有关更多信息和解决方法示例,请参见第 9.4 节“用户定义的变量”

数据库名称和 table 名称中的特殊字符编码为相应的文件系统名称,如第 9.2.4 节“将标识符 Map 到文件名”中所述。如果您有来自旧版本 MySQL 的数据库或 table,其中包含特殊字符,而其基础目录名称或文件名尚未更新为使用新编码,则服务器将显示其名称,并以#mysql50#作为前缀。有关引用此类名称或将其转换为较新的编码的信息,请参见该部分。