MySQL 8.4 Reference Manual  /  Language Structure  /  Schema Object Names

11.2 模式对象名称

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

标识符可以被引号或未引号引用。如果标识符包含特殊字符或是保留词语,你必须在每次引用时都引号它。 (例外:在qualified name中跟随一个点的保留词语需要是一个标识符,因此不需要引号。) 保留词语列表见第11.3节,“关键字和保留词语”

标识符内部被转换为并存储为Unicode(UTF-8)。标识符中的可允许的Unicode字符是Basic Multilingual Plane(BMP)的字符。补充字符不允许。因此,标识符可能包含这些字符:

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

    • ASCII:[0-9,a-z,A-Z$_](基本拉丁字母、数字0-9、美元符、下划线)

    • Extended:U+0080 .. U+FFFF

  • 引号标识符中的允许字符包括Basic Multilingual Plane(BMP)的所有Unicode字符,除U+0000外:

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

    • Extended:U+0080 .. U+FFFF

  • ASCII NUL(U+0000)和补充字符(U+10000 及更高)在引号或未引号标识符中都不允许。

  • 标识符可以以数字开头,但除非引号否则不能只包含数字。

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

  • 使用美元符号作为未引号名称的数据库、表、视图、列、存储程序或别名的第一个字符是弃用的,包括用于限定符的名称(见第11.2.2节,“Identifier Qualifiers”)。未引号标识符以美元符号开头不能包含任何额外的美元符号字符。否则,leading dollar sign 是允许的,但会触发弃用警告。

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

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

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节,“Server SQL Modes”中描述的方式控制。

标识符引号字符可以包含在标识符中,如果您引号了标识符。如果要包含的字符与用来引号标识符的字符相同,那么需要双倍该字符。以下语句创建一个名为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开头的名称,例如避免使用1e作为标识符,因为表达式1e+3可能会被解释为1e + 31e+3

使用MD5()生成表名时,需要小心,因为它可能会产生非法或模糊的名称,如前所述。

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

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

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