MySQL Server可執行註釋

来源:https://www.cnblogs.com/greatsql/archive/2022/08/19/16600846.html
-Advertisement-
Play Games

MySQL Server當前支持如下3種註釋風格: 以'# '開頭的單行註釋 以'-- '開頭的單行註釋 C語言風格的單行/多行註釋 如下sql腳本給出了3種註釋風格的示例: /* 這是一個 多行註釋 示例 */ select 1 from dual; select 2 from dual; # 單 ...


MySQL Server當前支持如下3種註釋風格:

  • 以'# '開頭的單行註釋
  • 以'-- '開頭的單行註釋
  • C語言風格的單行/多行註釋

如下sql腳本給出了3種註釋風格的示例:

/* 這是一個
多行註釋
示例
*/
select 1 from dual;
select 2 from dual; # 單行註釋用例1
select 3 from dual; -- 單行註釋用例2

可執行註釋

為了支持在不同資料庫之間的可移植性,MySQL Server針對C風格的註釋在解析上做了一些擴展,當註釋滿足如下風格時,MySQL Server將會解析並執行註釋中的代碼:

/*! MySQL-specific code */

通過比較如下兩個帶註釋的sql語句的執行結果可以比較直觀地看出可執行註釋語句的行為:

# 普通註釋,'+1' 被忽略
mysql> select 1 /* +1 */;
+---+
| 1 |
+---+
| 1 |
+---+

# 可執行註釋,'+1' 被當成語句的一部分
mysql> select 1 /*! +1 */;
+-------+
| 1  +1 |
+-------+
|     2 |
+-------+

藉助這一特性,我們就有機會編寫具備較好移植性的SQL語句, 在使MySQL獨有特性的同時,保證了sql在其它資料庫也能夠成功被執行:

create table t1(col1 int) /*! engine=MyISAM */;
select /*! STRAIGHT_JOIN */ col1 from t1;
...

/*!version-number SQL*/

在日常使用中,我們還會經常看到如下格式的註釋語句:

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE */
/*!80000 SET SESSION information_schema_stats_expiry=0 */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */

/*!跟的5位數字為版本指示器,其與資料庫版本的對應規則為:

'/' '*' '!', followed by exactly
第1位:主版本號(VERSION_MAJOR), 
第2, 3位:小版本號(VERSION_MINOR),
第4, 5位:Patch號(VERSION_PATCH)
示例:
32302 -> 3.23.02
50738 -> 5.7.38
80025 -> 8.0.25

以上述第一個註釋語句為例,它的含義可以描述為:當MySQL資料庫版本為5.0.3或更高版本時,將SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE讀取出來參與sql語法解析,並最終被執行;當MySQL版本低於5.0.3時,該行語句被當成一個普通的註釋。不難看出,帶version_number的可執行註釋,是為瞭解決不同的MySQL版本之間的相容問題。以8.0.23版本新增的Invisible Columnsw為例, 如下建表語句在8.0.23版本之前將無法執行:

CREATE TABLE t1 (i INT, j DATE INVISIBLE);

如下的語句改造則保證了建表語句的向下版本相容:

CREATE TABLE t1 (i INT, j DATE /*!80023 INVISIBLE */);

實際上,在我們常用的工具mysqldump也借用這個特性,使得產生的sql能夠相容不同的資料庫版本:

/*mysqldump 代碼片段*/
   dump_fputs(
        sql_file,
        "/*!50717 SELECT COUNT(*) INTO @rocksdb_has_p_s_session_variables"
        " FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ="
        " 'performance_schema' AND TABLE_NAME = 'session_variables'"
        " */;\n"
        "/*!50717 SET @rocksdb_get_is_supported = IF"
        " (@rocksdb_has_p_s_session_variables, 'SELECT COUNT(*) INTO"
        " @rocksdb_is_supported FROM performance_schema.session_variables"
        " WHERE VARIABLE_NAME=\\'rocksdb_bulk_load\\'', 'SELECT 0') */;\n"
        "/*!50717 PREPARE s FROM @rocksdb_get_is_supported */;\n"
        "/*!50717 EXECUTE s */;\n"
        "/*!50717 DEALLOCATE PREPARE s */;\n"
        "/*!50717 SET @rocksdb_enable_bulk_load = IF"
        " (@rocksdb_is_supported, 'SET SESSION rocksdb_bulk_load = 1',"
        " 'SET @rocksdb_dummy_bulk_load = 0') */;\n"
        "/*!50717 PREPARE s FROM @rocksdb_enable_bulk_load */;\n"
        "/*!50717 EXECUTE s */;\n"
        "/*!50717 DEALLOCATE PREPARE s */;\n");
    check_io(sql_file);

在show create table等語句中我們也能看到類似的應用(sql/sql_show.cc):

mysql> create table t1 (i int, j date invisible);
Query OK, 0 rows affected (0.03 sec)

mysql> show create table t1;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `i` int DEFAULT NULL,
  `j` date DEFAULT NULL /*!80023 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

結語

mysql server提供的可執行註釋功能,在橫向跨資料庫和縱向跨版本相容上都為資料庫用戶提供了較大支持,是一個比較便利的特性。功能實現上,mysql server是在詞法解析階段先對語句做了一遍攔截,針對/*!按具體情況做了特殊處理,如有興趣您可以參考mysql的詞法解析相關源碼。註:以8.0.25版本為例,它的相關解析放在sql_lex.cc的lex_one_token()中,在其中您也能看見mysql詞法解析器是怎麼對optimizer hints comments(格式: /*+ optimizer_hints */ )進行處理的。


Enjoy GreatSQL

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文摘選自『Docker-從入門到實踐』,該書籍較詳細地記錄了 Docker 的知識,強烈推薦。 警告:切勿在沒有配置 Docker APT 源的情況下直接使用 apt 命令安裝 Docker. 準備工作 系統要求 Docker 支持以下版本的 Ubuntu 操作系統: Ubuntu Hirsute ...
  • 第一章節(p0-p20) 1、Linux使用在哪些地方 1、LInux嵌入式工程師、Linux運維工程師 2、最主要在伺服器領域、(免費,穩定、高效) 3、嵌入式領域(對軟體進行裁剪) 4、以後在物聯網中會應用更加廣泛 2、Linux介紹 1、常見操作系統:Windows、IOS、Android、M ...
  • MySQL視圖 一.視圖的概念 1.什麼是視圖: SQL語句的執行結果是一張虛擬表 我們可以基於該表做其他操作如果這張虛擬表需要頻繁使用 那麼為了方便可以將虛擬表保存起來 保存起來之後就稱之為"視圖"(本質就是一張虛擬表) 2.視圖的優點: 1)簡單:使用視圖的用戶完全不需要關心後面對應的表的結構、 ...
  • Navicat Premium 16 是一款可以多重連接的資料庫管理工具。與舊版本相比,Navicat 16 帶來了許多 UI/UX 改進。我們致力於提供專業的 UX 設計,以提高可用性和可訪問性。因此,你能夠以前所未有的速度完成複雜的工作。 Mac版:Navicat Premium for Mac ...
  • #網上有很多讀寫分離的中間件,像proxy,mycat等等,由於本人比較懶,懶得去讀各種開源的東西,還是想造輪子來得快。 ##1、瞭解mysql通信協議,其中有分4.1之前和4.1版本的,由於4.1之前幾乎沒有人去使用了,所以我就直接按4.1的版本來實現。 ##2、找一個解析sql的庫,從而得到sq ...
  • 8月18日,由騰訊聯合中國電子節能技術協會牽頭研製的《鍵值型資料庫系統技術及節能要求》團體標準(以下簡稱“團標”)正式對外發佈。 該團標由騰訊發起,京東、金山雲、北京郵電大學等多家企業和高校共同參與制定,這一標準的建立,建立了國內資料庫領域節能技術要求標準,將為業界發展和節能減耗提供更多助力。 此次 ...
  • 8月17日,騰訊Q2財報首次披露了資料庫的收入增幅:“我們聚焦高質量的收入增長,優先專註自研產品同時減少虧損項目。PaaS方面,TDSQL資料庫收入同比增長超過30%,占2022年第二季企業服務營收超過5%。弗若斯特沙利文將TDSQL評為中國領先的分散式資料庫產品,肯定其可擴展性及行業解決方案服務支 ...
  • InnoDB導入StoneDB 此場景是利用mysqldump從InnoDB導出,然後再導入StoneDB,在導入StoneDB前,需要對導出文件做如下修改。 1)修改存儲引擎 CREATE TABLE `t_user` ( xxx ) ENGINE=InnoDB; CREATE TABLE `t_ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...