MySQL对分隔符的处理(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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服务的正常使用。
285 82
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
257 42
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。

热门文章

最新文章