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

11.7 注释

MySQL 服务器支持三种注释样式:

  • # 字符到行尾。

  • --  序列到行尾。在 MySQL 中,-- (双破折号)注释样式需要第二个破折号后跟至少一个空白字符或控制字符(例如空格、制表符、新行等)。这与标准 SQL 注释语法略有不同,如 第 1.6.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 8.3.0 或更高版本的服务器上运行的语句中,使用 80300 在注释中。

在 MySQL 8.3 中,版本号也可以是六位数字的 MMmmrr 格式,其中 MM 是两位主要版本,mmrr 分别是两位小版本和两位发布号。

版本号应该跟随至少一个空白字符(或注释的结尾)。如果注释以六位数字开头,后跟空白字符,这将被解释为六位版本号。否则,如果它以至少五位数字开头,这些将被解释为五位版本号(并忽略剩余字符);如果它以少于五位数字开头,注释将被处理为普通 MySQL 注释。

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

/*!12345 ... */ 格式编写的注释不会被服务器存储。如果使用这种格式来注释存储程序,那么注释将不会保留在程序体中。

C 风格注释语法的另一个变体用于指定优化器提示。提示注释包括一个 + 字符,紧跟在 /* 注释开头序列之后。示例:

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

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

不支持在多行 /* ... */ 注释中使用短格式的 mysql 命令,例如 \C。短格式命令在单行 /*! ... */ 版本注释中有效,也可以在 /*+ ... */ 优化器提示注释中使用,这些注释将被存储在对象定义中。如果担心优化器提示注释可能被存储在对象定义中,以便在使用 mysql 重新加载转储文件时执行这些命令,可以使用 mysql--binary-mode 选项或使用其他重新加载客户端,而不是 mysql