MySQL对分隔符的处理(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

 

(接上篇)

    问题就出在find_command函数这里,让我们find_command干了什么事。它并没有像我们想像的那样在长格式的系统命令的行尾添加分号不会影响命令的正常执行。

Code:

 

 

    

    客户端没有把source pp#idhuishou.sql;当成命令处理,接下来就交给了add_line来处理了,而add_line又会把井号后面的内容全部当做注释处理掉,不会传给MySQL然后接着等待另一个分号的输入以做为语句的结束,因此source pp#idhuishou.sql;就变成了source pp。下面就是add_line函数的代码:

 

 

 

 

    如果输入的系统命令结尾带有分号find_command就会将系统命令当成普通的SQL语句来处理,不使用单独的处理函数,这样会不会有问题呢?下面以com_source为例,看一看MySQL是如何处理SOURCE命令的。

 

 

 

    看到这里还有个疑问,既然MySQL的系统命令分别有单独的函数进行处理,

 

 

static int com_source(String *buffer, char *line)                                                                                                             {   ... ...   error= read_and_execute(false);//以非交互模式嵌套调用read_and_execute函数... ...

return error; 

//可见com_source并没做什么实事,检测了一下将要处理的文件的可读性,

//和普通SQL语句一样把又任务交给了read_and_execute结尾处的com_go函数来处理

}

下面列举所有的MySQL系统命令如下:

mysql> ?  

For information about MySQL products and services, visit:http://www.mysql.com/

 

For developer information, including the MySQL Reference Manual, visit:http://dev.mysql.com/ To buy MySQL Network Support, training, or other products, visit:https://shop.mysql.com/ List of all MySQL commands: Note that all text commands must be first on line and end with ';' ? (\?) Synonym for `help'. clear (\c) Clear command. connect (\r) Reconnect to the server. Optional arguments are db and host. delimiter (\d) Set statement delimiter. NOTE: Takes the rest of the line as new delimiter. edit (\e) Edit command with $EDITOR. ego (\G) Send command to mysql server, display result vertically. exit (\q) Exit mysql. Same as quit. go (\g) Send command to mysql server. help (\h) Display this help. nopager (\n) Disable pager, print to stdout. notee (\t) Don't write into outfile. pager (\P) Set PAGER [to_pager]. Print the query results via PAGER. print (\p) Print current command. prompt (\R) Change your mysql prompt. quit (\q) Quit mysql. rehash (\#) Rebuild completion hash. source (\.) Execute an SQL script file. Takes a file name as an argument. status (\s) Get status information from the server. system (\!) Execute a system shell command. tee (\T) Set outfile [to_outfile]. Append everything into given outfile. use (\u) Use another database. Takes database name as argument. charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets. warnings (\W) Show warnings after every statement. nowarning (\w) Don't show warnings after every statement. For server side help, type 'help contents'

总结 要清楚的知道哪些语句是系统命令,哪些语句是标准的SQL语句,系统命令结尾最好不要有分号。

MySQL手册也有盲点,还是代码靠谱。

 

 

 

tatic bool add_line(String &buffer,char *line,char *in_string,
                     bool *ml_comment)
{
... ...
 

else if (!*ml_comment && (!*in_string && (inchar == '#' || 

//就是这里把"#"号"-- "等后面的内容都当做注释处理掉了

inchar == '-' && pos[1] == '-' && my_isspace(charset_info,pos[2])))) break; // comment to end of line ... ... }

 

 

static COMMANDS *find_command(char *name,char cmd_char){     ... ...

if (strstr(name, "\\g") || (strstr(name, delimiter) &&  

//语句中含有分号,\g或通过delimiter指定的其他分隔符,客户端就不会把这条语句当成系统命令。

//问题就出在这里,当find_command函数看到分号或\g无论如何它都不会把语句当成系统命令来处理


!(strlen(name) >= 9 && !my_strnncoll(charset_info, (uchar*) name, 9, (const uchar*) "delimiter", 9))))

DBUG_RETURN((COMMANDS *) 0); 

//判断不是系统命令就返回一个空指针

if ((end=strcont(name," \t"))) { len=(uint) (end - name); while (my_isspace(charset_info,*end)) end++; if (!*end)

end=0;  

// no arguments to function

} else len=(uint) strlen(name); ... ... }

 











本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/748591,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
133 82
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
215 42
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
161 25
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。

推荐镜像

更多