1.8.2.4 '-'作为 Comments 的开始

标准 SQL 使用 C 语法/* this is a comment */进行 Comments,而 MySQL Server 也支持该语法。 MySQL 还支持对此语法的扩展,该扩展使特定于 MySQL 的 SQL 可以嵌入到 Comments 中,如第 9.6 节“Comments 语法”中所述。

标准 SQL 使用“ --”作为开始 Comments 序列。 MySQL Server 使用#作为开始 Comments 字符。 MySQL Server 还支持--Comments 样式的变体。也就是说,--起始 Comments 序列后必须跟一个空格(或一个控制字符,例如换行符)。需要该空间以防止使用以下结构的自动生成的 SQL 查询出现问题,在该结构中我们自动插入payment的付款值:

UPDATE account SET credit=credit-payment

考虑如果payment的值为负值,例如-1,会发生什么情况:

UPDATE account SET credit=credit--1

credit--1是 SQL 中的有效 table 达式,但是--被解释为 Comments 的开头,该 table 达式的一部分被丢弃。结果是一条语句,其含义与预期的完全不同:

UPDATE account SET credit=credit

该声明根本不会改变价值。这说明允许 Comments 以--开头可能会造成严重后果。

使用我们的实现需要在--之后有一个空格,以便在 MySQL Server 中将其识别为开始 Comments 序列。因此,credit--1是安全使用的。

另一个安全功能是mysql命令行 Client 端忽略以--开头的行。