Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Language Structure  /  Schema Object Names

11.2 模式对象名称

在 MySQL 中,某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间、资源组等对象名称称为标识符。本节描述了 MySQL 中标识符的可接受语法。第 11.2.1 节,「标识符长度限制」,指出了每种类型标识符的最大长度。第 11.2.3 节,「标识符大小写敏感性」,描述了哪些类型的标识符是大小写敏感的,以及在什么条件下。

标识符可以是带引号或不带引号的。如果标识符包含特殊字符或是保留字,你 必须 在引用时将其带引号。(例外:在限定名称中跟随句点的保留字必须是一个标识符,因此不需要带引号。)保留字列举在 第 11.3 节,「关键字和保留字」

在内部,标识符被转换为 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 节,「标识符限定符」)。未带引号的标识符以美元符号开头不能包含其他美元符号字符。否则,leading 美元符号是允许的,但会触发弃用警告。

    美元符号仍然可以用作这种标识符的leading 字符,而不产生警告,当它被根据后面所述的规则引号时。

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

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);

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

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

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

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

在使用 MD5() 生成表名时要小心,因为它可能生成非法或ambiguous的名称,如上所述。

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

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

数据库和表名中的特殊字符在对应的文件系统名称中被编码,如 第 11.2.4 节,“标识符到文件名的映射” 所述。