博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL对分隔符的处理(二)
阅读量:5798 次
发布时间:2019-06-18

本文共 3431 字,大约阅读时间需要 11 分钟。

 

(接上篇)

    问题就出在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,如需转载请自行联系原作者
你可能感兴趣的文章
CentOS 6.5 安装Puppet
查看>>
升级x86info CPU检测工具
查看>>
我的友情链接
查看>>
搭建基于证书认证登录的Open***2.4.6服务器部署
查看>>
2016我的时间我的生存
查看>>
小米手机中host文件位置【system/etc/hosts】
查看>>
LSOF命令在crontab中无法执行解决方法
查看>>
Java数据类型小计
查看>>
Linux yum 搭建
查看>>
【安装源码包】
查看>>
警方再对巴黎春天“促销送iPad”展开安全排查
查看>>
浅谈氛围营销
查看>>
Linux/Unix 命令ls -l显示文件信息
查看>>
Shell下 echo 更改字体颜色
查看>>
熟练的Java程序员应该掌握哪些技术?
查看>>
NFS服务器(用的不多)
查看>>
使用 Emmet 生成 HTML 的语法详解(自动生成标签)
查看>>
在TTF字体中提取想要的文字,让字体文件变迷你
查看>>
设计模式---适配器模式
查看>>
Windows下配置安装Git(四)
查看>>