MySQL 8.0 参考手册  / 第9章语言结构  /  9.2 模式对象名称

9.2 模式对象名称

MySQL 中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名称,称为标识符。本节描述了 MySQL 中标识符的允许语法。 第 9.2.1 节,“标识符长度限制”,指示每种标识符的最大长度。 第 9.2.3 节,“标识符区分大小写”,描述了哪些类型的标识符区分大小写以及在什么条件下。

标识符可以被引用或不被引用。如果标识符包含特殊字符或者是保留字, 则在引用它时必须引用它。(例外:限定名称中跟在句点后面的保留字必须是标识符,因此不需要用引号引起来。)保留字在第 9.3 节“关键字和保留字”中列出。

在内部,标识符被转换为并存储为 Unicode (UTF-8)。标识符中允许的 Unicode 字符是基本多语言平面 (BMP) 中的字符。不允许使用增补字符。因此标识符可能包含这些字符:

  • 不带引号的标识符中允许的字符:

    • ASCII:[0-9,az,AZ$_](基本拉丁字母、数字 0-9、美元、下划线)

    • 扩展:U+0080 .. U+FFFF

  • 引用标识符中允许的字符包括完整的 Unicode 基本多语言平面 (BMP),U+0000 除外:

    • ASCII: U+0001 .. U+007F

    • 扩展:U+0080 .. U+FFFF

  • 带引号或不带引号的标识符中不允许使用 ASCII NUL (U+0000) 和增补字符(U+10000 及更高)。

  • 标识符可以以数字开头,但除非引用,否则不能仅由数字组成。

  • 数据库、表和列名称不能以空格字符结尾。

标识符引号字符是反引号 ( `):

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模式使服务器将双引号字符串解释为标识符。因此,当启用此模式时,字符串文字必须用单引号引起来。它们不能用双引号引起来。服务器 SQL 模式按照第 5.1.10 节“服务器 SQL 模式”中的描述进行控制。

如果引用标识符,标识符引号字符可以包含在标识符中。如果要包含在标识符中的字符与用于引用标识符本身的字符相同,则需要将字符加倍。以下语句创建一个名为 的表a`b ,其中包含一个名为 的列c"d

mysql> CREATE TABLE `a``b` (`c"d` INT);

在查询的选择列表中,可以使用标识符或字符串引号字符指定带引号的列别名:

mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+

在语句的其他地方,对别名的引用必须使用标识符引用,否则引用将被视为字符串文字。

建议您不要使用以 Meor 开头的名称,其中和 是整数。例如,避免使用as 标识符,因为诸如 之类的表达式是不明确的。根据上下文,它可能被解释为 expression或 number 。 MeNMN1e1e+31e + 31e+3

用于生成表名时要小心,MD5()因为它可能会生成非法或模棱两可的格式的名称,例如刚刚描述的那些。

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

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