11.7 注释

MySQL 服务器支持三种注释风格

  • 从一个 # 字符到行尾。

  • 从一个 --  序列到行尾。在 MySQL 中,-- (双破折号)注释风格要求第二个破折号后面至少有一个空格或控制字符(例如空格、制表符、换行符等)。此语法与标准 SQL 注释语法略有不同,如 1.7.2.4 节,“'--' 作为注释的开始” 中所述。

  • 从一个 /* 序列到下一个 */ 序列,就像在 C 编程语言中一样。此语法允许注释跨越多行,因为开始和结束序列不必在同一行上。

以下示例演示了所有三种注释风格

mysql> SELECT 1+1;     # This comment continues to the end of line
mysql> SELECT 1+1;     -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;

不支持嵌套注释,并且已弃用;预期它们将在未来的 MySQL 版本中被删除。(在某些情况下,可能会允许嵌套注释,但通常不允许,用户应避免使用它们。)

MySQL 服务器支持 C 风格注释的某些变体。这些变体使您能够编写包含 MySQL 扩展的代码,但仍然是可移植的,方法是使用以下形式的注释

/*! MySQL-specific code */

在这种情况下,MySQL 服务器会像解析和执行任何其他 SQL 语句一样解析和执行注释内的代码,但其他 SQL 服务器应忽略这些扩展。例如,MySQL 服务器在以下语句中识别 STRAIGHT_JOIN 关键字,但其他服务器不应该识别

SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...

如果在 ! 字符后添加版本号,则仅当 MySQL 版本大于或等于指定的版本号时,才会执行注释内的语法。以下注释中的 KEY_BLOCK_SIZE 关键字仅由 MySQL 5.1.10 或更高版本的服务器执行

CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;

版本号使用 Mmmrr 格式,其中 M 是主版本,mm 是两位数的次版本,rr 是两位数的发行版本号。例如:在仅针对 MySQL 服务器版本 9.0.0 或更高版本的语句中,在注释中使用 90000

在 MySQL 9.0 中,版本号还可以选择由六位数字组成,格式为 MMmmrr,其中 MM 是两位数的主版本,mmrr 分别是两位数的次版本和两位数的发行版本号。

版本号后面应该至少有一个空格字符(或注释的结尾)。如果注释以六位数字后跟空格开始,则将其解释为六位数字的版本号。否则,如果它以至少五个数字开始,则将其解释为五位数字的版本号(为此目的,忽略任何剩余的字符);如果它以少于五个数字开始,则注释将被视为普通的 MySQL 注释。

刚刚描述的注释语法适用于 mysqld 服务器如何解析 SQL 语句。 mysql 客户端程序也会在将语句发送到服务器之前执行一些解析。(它这样做是为了确定多语句输入行中的语句边界。)有关服务器和 mysql 客户端解析器之间差异的信息,请参阅 6.5.1.6 节,“mysql 客户端提示”

/*!12345 ... */ 格式的注释不会存储在服务器上。如果此格式用于注释存储程序,则注释不会保留在程序主体中。

C 风格注释语法的另一种变体用于指定优化器提示。提示注释包括在 /* 注释打开序列后的 + 字符。示例

SELECT /*+ BKA(t1) */ FROM ... ;

有关更多信息,请参阅 10.9.3 节,“优化器提示”

不支持在多行 /* ... */ 注释内使用 \C 等短格式 mysql 命令。短格式命令可以在单行 /*! ... */ 版本注释内使用,就像 /*+ ... */ 优化器提示注释一样,它们存储在对象定义中。如果担心优化器提示注释可能会存储在对象定义中,以便使用 mysql 重新加载转储文件会导致执行此类命令,请使用 mysql--binary-mode 选项调用 mysql,或使用除 mysql 以外的其他重新加载客户端。