查看原文
其他

"--"注释在Oracle和MySQL下的区别

GreatSQL社区 2024-07-08

* GreatSQL使

服务端

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-00936missing expression

  SQLselect   
    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 可能在处理语句结束符 ; 时也有两种解释:

  1. -- 注释之后的语句结束符:由于语句结束符在注释中被当作注释处理,所以 MySQL 客户端在处理这种语句结束符时并不会将前面的语句提交给服务器处理。
  2. -- 表达式之后的语句结束符:这种情况就按默认处理,将语句结束符 ; 之前的所有语句内容提交给服务器进行处理。

示例:

  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 客户端两种处理方式的结合,即:-- 之后的所有内容才表示为注释,但遇到语句结束符 ; 则提交服务器处理。

Enjoy GreatSQL :)


《深MGR

B

https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0


文章推荐:



关于 GreatSQL


GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

GreatSQL社区官网: 
https://greatsql.cn/

Gitee: 
https://gitee.com/GreatSQL/GreatSQL

GitHub: 
https://github.com/GreatSQL/GreatSQL

 Bilibili
https://space.bilibili.com/1363850082/video

https://greatsql.cn/

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)


微信&QQ群:

可扫码添加GreatSQL社区助手微信好友,
送验证信息“加群”加入GreatSQL/MGR交流微信群,亦可直接扫码加入GreatSQL/MGR交流QQ群


QQ



想看更多技术好文,点个“在看”吧!

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存