"--"注释在Oracle和MySQL下的区别
服务端
Oracle 中语句注释符 --
之后的所有语句内容都会被当作注释。
SQL> SELECT 1,
2 --1,
3 1
4 FROM DUAL;
1 1
---------- ----------
1 1
SQL> SELECT 1,
2 -- 1,
3 1
4 FROM DUAL;
1 1
---------- ----------
1 1
MySQL 中语句注释符 --
之后只有在跟随空格 (--
)时才被当作是注释符,否则会与其后的字符串会被当作表达式处理。
[MySQL]> SELECT 1,
-> --1,
-> 1
-> FROM DUAL;
+---+-----+---+
| 1 | --1 | 1 |
+---+-----+---+
| 1 | 1 | 1 |
+---+-----+---+
[MySQL]> SELECT 1,
-> -- 1,
-> 1
-> FROM DUAL;
+---+---+
| 1 | 1 |
+---+---+
| 1 | 1 |
+---+---+
客户端
SQL*Plus 中将语句结束符 ;
之前的所有语句内容作为一条 SQL 语句交给服务器进行处理,故而产生以下现象:
SQL> SELECT --t.b FROM test_comment t;
SELECT --t.b FROM test_comment t
*
ERROR at line 1:
ORA-00936: missing expression
SQL> select
2 a, b from test_comment --comments;
A B
---------- ----------
0 1
3 4
第一条语句中,即使 ;
位于 --
之后,但在 SQL*Plus 中并不会将其视为注释的一部分,而是仍然将其视为语句结束符,所以将 SELECT --t.b FROM test_comment t
提交服务器处理,服务器处理语句时将 --
之后的内容都当作注释处理,因此,这条语句在服务器看来只有 SELECT
关键字,所以报错。第二条语句同理,但由于 --
之前包含了完整且合法的语句 select a,b from test_comment
所以服务器可以正常处理。
官方手册说明:Notes on Placing Comments
MySQl 客户端虽然也是将语句结束符 ;
之前的所有语句内容作为一条 SQL 语句交给服务器进行处理,但比较特殊的是 MySQL 客户端会将 --
注释中的 ;
当作是注释的一部分而不是语句结束符。
注意:在 MySQL 客户端中,--
后面跟随空格 (--
)才被当作是注释符,否则会与其后的字符串会被当作表达式处理,例如:
[MySQL]> SELECT 1,
-> --1,
-> 1
-> FROM DUAL;
+---+-----+---+
| 1 | --1 | 1 |
+---+-----+---+
| 1 | 1 | 1 |
+---+-----+---+
[MySQL]> SELECT 1,
-> -- 1,
-> 1
-> FROM DUAL;
+---+---+
| 1 | 1 |
+---+---+
| 1 | 1 |
+---+---+
由于对 --
的处理存在两种解释的可能,所以导致 MySQL 可能在处理语句结束符 ;
时也有两种解释:
-
--
注释之后的语句结束符:由于语句结束符在注释中被当作注释处理,所以 MySQL 客户端在处理这种语句结束符时并不会将前面的语句提交给服务器处理。 -
--
表达式之后的语句结束符:这种情况就按默认处理,将语句结束符;
之前的所有语句内容提交给服务器进行处理。
示例:
root@mysqldb 10:54: [test]> SELECT --1;
+-----+
| --1 |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)
root@mysqldb 10:54: [test]> SELECT -- 1;
-> 2;
+---+
| 2 |
+---+
| 2 |
+---+
1 row in set (0.00 sec)
另外,在 MTR
脚本中的情况是 SQL*Plus 和 MySQL 客户端两种处理方式的结合,即:--
之后的所有内容才表示为注释,但遇到语句结束符 ;
则提交服务器处理。
本文转载自公众号:GreatSQL社区