成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊 MySQL Server 可執行注釋,你懂了嗎?

數據庫 MySQL
MySQL Server提供的可執行注釋功能,在橫向跨數據庫和縱向跨版本兼容上都為數據庫用戶提供了較大支持,是一個比較便利的特性。

前言

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 */ )進行處理的。

責任編輯:武曉燕 來源: GreatSQL社區
相關推薦

2024-04-07 08:23:01

JS隔離JavaScript

2022-06-06 07:58:52

勒索軟件惡意軟件解密

2022-06-07 08:14:35

PGPAGETUPLE

2011-06-14 12:56:55

SQL Server復災

2022-08-15 07:24:41

WindowsDLL鍵盤

2022-06-15 08:00:50

磁盤RedisRocketMQ

2021-10-10 20:36:49

Android Root權限

2022-01-06 07:59:32

WebGPUOpenGL引擎

2022-10-19 08:19:32

動態基線預警

2022-05-06 08:26:32

JavaSPI機制

2022-06-28 08:42:03

磁盤kafka高性能

2022-11-28 07:10:57

2024-08-12 15:23:43

LangChain

2022-04-12 11:46:08

服務gRPC反向代理

2024-04-29 09:25:19

2022-07-27 08:01:29

CMS垃圾回收器

2024-08-12 12:30:27

2020-10-25 08:45:38

IPv6網絡協議網絡

2023-06-27 07:09:39

2022-04-07 08:20:22

typeinterface前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品一区二区视频 | 91视频免费观看 | 中文字幕在线观看 | 一区二区三区在线观看视频 | 欧美国产91 | 国产精品一区二区三区四区五区 | 国产激情视频网站 | 国产精品久久久久久久久久久久久 | 国产激情精品一区二区三区 | 亚洲图片视频一区 | 日韩av成人| 日本精a在线观看 | 黄色在线免费观看 | 一区二区不卡 | 99精品视频在线 | 在线播放亚洲 | 久久久国产精品 | 成人在线免费看 | 国产亚洲一区二区三区在线 | 日韩中文字幕一区二区 | 欧美精品一区二区在线观看 | av片毛片| 久久精品手机视频 | 桃花av在线 | 欧美狠狠操 | 草草影院ccyy| 天堂精品 | 国产精品一区二 | 一级视频黄色 | 婷婷综合色 | 精品电影 | 日本五月婷婷 | 人人看人人搞 | 欧美午夜剧场 | 天堂久久网 | 成人免费一区二区三区视频网站 | 不卡av电影在线播放 | 99热精品6 | 亚洲欧美精品 | 欧美一级二级视频 | 成人av网站在线观看 |