MySQL 9.0 参考手册  /  语言结构  /  架构对象名称

11.2 架构对象名称

MySQL 中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间、资源组和其他对象名称,被称为标识符。本节介绍 MySQL 中标识符的允许语法。 第 11.2.1 节,“标识符长度限制” 指出每种类型标识符的最大长度。 第 11.2.3 节,“标识符大小写敏感性” 说明哪种类型的标识符区分大小写,以及在什么情况下区分大小写。

标识符可以是带引号的,也可以是不带引号的。如果标识符包含特殊字符或是一个保留字,则在引用它时,您 必须 对它加引号。(例外:保留字在限定名中的句号之后,必须是一个标识符,因此不需要加引号。)保留字在 第 11.3 节,“关键字和保留字” 中列出。

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

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

    • ASCII: [0-9,a-z,A-Z$_] (基本拉丁字母、数字 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 及更高) 不允许在带引号或不带引号的标识符中使用。

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

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

  • 不推荐使用以美元符号作为数据库、表、视图、列、存储程序或别名的非引号名称的第一个字符,包括使用限定符的名称(参见 第 11.2.2 节,“标识符限定符”)。以美元符号开头的非引号标识符不能包含任何其他美元符号字符。否则,允许使用前导美元符号,但会触发弃用警告。

    当根据本节后面给出的规则对该标识符加引号时,美元符号仍可以作为该标识符的第一个字符使用,而不会产生警告。

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

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 模式控制方式如 第 7.1.11 节,“服务器 SQL 模式” 中所述。

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

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

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

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

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

建议您不要使用以 MeMeN 开头的名称,其中 MN 是整数。例如,避免使用 1e 作为标识符,因为像 1e+3 这样的表达式模棱两可。根据上下文,它可能被解释为表达式 1e + 3 或数字 1e+3

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

还建议您不要使用以 !hidden! 开头的列名,以确保新名称不会与现有功能索引使用的隐藏列的名称冲突。

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

数据库和表名中的特殊字符将按照 第 11.2.4 节,“标识符到文件名的映射” 中所述的方式编码在相应的目录名中。