数字模高指示器(聊聊 MySQL Server 可执行注释,你懂了吗?)

Posted

篇首语:不要在乎别人的眼光,这样我们会生不如死。本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字模高指示器(聊聊 MySQL Server 可执行注释,你懂了吗?)相关的知识,希望对你有一定的参考价值。

数字模高指示器(聊聊 MySQL Server 可执行注释,你懂了吗?)

前言

MySQL Server当前支持如下3种注释风格:

  • 以'#'开头的单行注释
  • 以'-- '开头的单行注释
  • C语言风格的单行/多行注释

如下SQL脚本给出了3种注释风格的示例:

/* 这是一个多行注释示例*/select 1 from dual;select 2 from dual; # 单行注释用例1select 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.0250738 -> 5.7.3880025 -> 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 */ )进行处理的。

相关参考

数据库处理软件(10款好用的MySQL GUI工具)

MySQL是比较广泛使用和流行的开源数据库之一,围绕它有许多工具,可以让设计,创建和管理数据库的过程变得更加容易和便捷。但是如何选择最适合自己需求的工具,并不容易。这里为大家推荐10款MySQL的GUI工具,它们对开发人...

数据库安装完怎么打开(发完就删的Mysql 57解压版下载安装及配置教程)

最近在学习中用到了MySQL数据库,在安装过程中遇到了不少问题,在翻了大半天百度后,问题基本都解决了,所以写一篇MySQL5.7解压版的图文详细安装教程。至于为什么我会选择解压版而不是安装版,一是因为安装版没有64位版本...

怎么连接苹果手表(MYSQL数据库的连表操作)

在mysql中,有四种连表操作:内连接左连接右连接全连接首先准备两个表的数据,员工表和部门表,这里的数据主要是做测试,所以两个表并没有搞外键关联员工表(employee):idnamedep_id1张三3002李四3003王五3014赵起3025李九3036何...

广告电子显示屏(NEC推出专业级4K数字广告板显示器新品V554Q)

专业级显示器制造商NEC,刚刚发布了一款面向数字广告板应用的专业级4K显示器新品,它就是采用了55英寸IPS面板、分辨率3840×21060、最大亮度500尼特、对比度1100:1(支持区域调光)、刷新率60Hz、响应时间8-ms、可视角度178°的V554Q...

校园失物招领范文(JSP+Spring+SpringMVC+Hibernate+Mysql实现的校园失物招领网站)

...【源码】即可获取!本系统基于JSP+Spring+SpringMVC+Hibernate+Mysql的校园失物招领网站。本系统没有使用常用的SSM或者SSH框架,而是以Spring+SpringMVC+Hibernate三个框架结合来完成。这样能完美诠释框架是服务于服务,只要某个框架利于您...

影响性能的因素(MySQL 性能优化之影响性能的因素)

转载于:martinhttps://gitbook.cn/books/5ae950b4795eef762711ee63/index.html既然要优化数据库,我们就首先要知道,优化的是什么,或者说:什么因素影响了数据库的性能。影响数据库因素主要因素总结如下:商业需求对性能的影响*系统架构...

数据恢复中心(「虚拟机数据恢复」VMware ESX SERVER数据恢复案例)

...*化某省分公司的信息管理平台,几十台VMware虚拟机(ESXSERVER)共享一台IBM存储。北亚数据恢复——VMware虚拟机数据恢复虚拟机故障&分析:正常工作时候vc上报告虚拟磁盘丢失,管理员ssh到ESX中执行fdisk-l命令查看磁盘,发现STORAGE...

意大利过滤器(意大利DINI ARGEO称重显示器)

【广州兰瑟电子】杨工提供DFWL数字重量指示器意大利DINIARGEO称重显示器产品资料DFWL数字重量指示器用途广泛,易于编程和使用。广泛的可用功能和接口使其适用于许多不同类型的工业和商业称重应用。适用于托盘车秤、叉车和...

服务器2003系统怎么装(VMware虚拟机安装Windows XP教程以及如何部署Windows Server 2003)

...作挑战赛#VMware虚拟机安装WindowsXP教程以及如何部署WindowsServer2003VMware虚拟机安装WindowsXP学习教程(搭配音乐阅读有助更好学习)软件链接:①VMwareWorkstation软件【下载链接】http://ai95.microsoft-cloud.cn/d/9289114-49833935-3c06d9?p=ai95(访问...

思科路由器怎么设置多个端口连接(Windows server DHCP服务器为多个VLAN分配IP地址)

网络拓扑一、DHCP服务器配置(Windows2008)1、在DHCP服务器上建立三个作用域2、DHCP服务器路由设定在不同的IP地址段的路由选项设定对应VLAN的网关地址,那么不同VLAN就可以得到相应的IP二、核心交换机配置(三层交换为Cisco3560)1...