
MySQL Server可执行注释
- 前言
- 可执行注释
- 结语
前言
MySQL Server当前支持如下3种注释风格:
- 以'#'开头的单行注释
- 以'-- '开头的单行注释
- C语言风格的单行/多行注释
如下SQL脚本给出了3种注释风格的示例:
可执行注释
为了支持在不同数据库之间的可移植性,MySQL Server针对C风格的注释在解析上做了一些扩展,当注释满足如下风格时,MySQL Server将会解析并执行注释中的代码:
通过比较如下两个带注释的SQL语句的执行结果可以比较直观地看出可执行注释语句的行为:
借助这一特性,我们就有机会编写具备较好移植性的SQL语句, 在使用MySQL独有特性的同时,保证了SQL语句在其它数据库也能够成功被执行:
/*!version-number SQL*/
在日常使用中,我们还会经常看到如下格式的注释语句:
/*!
后跟的5位数字为版本指示器,其与数据库版本的对应规则为:
以上述第一个注释语句为例,它的含义可以描述为:当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版本之前将无法执行:
如下的语句改造则保证了建表语句的向下版本兼容:
实际上,在我们常用的工具mysqldump也借用这个特性,使得产生的SQL能够兼容不同的数据库版本:
在show create table等语句中我们也能看到类似的应用(sql/sql_show.cc):
结语
MySQL Server提供的可执行注释功能,在横向跨数据库和纵向跨版本兼容上都为数据库用户提供了较大支持,是一个比较便利的特性。功能实现上,MySQL Server是在词法解析阶段先对语句做了一遍拦截,针对/*!
按具体情况做了特殊处理,如有兴趣您可以参考MySQL的词法解析相关源码。注:以8.0.25版本为例,它的相关解析放在sql_lex.cc的lex_one_token()中,在其中您也能看见MySQL词法解析器是怎么对optimizer hints comments(格式: /*+ optimizer_hints */
)进行处理的。
本文转载自公众号:GreatSQL社区
