设为首页 收藏本站
查看: 1582|回复: 0

[经验分享] MySQL对分隔符的处理(一)

[复制链接]

尚未签到

发表于 2018-10-1 10:01:53 | 显示全部楼层 |阅读模式
  MySQL的语法与标准SQL语法相同,默认使用分号“;”作为一条SQL语句结束的标志。且可以使用delimiter命令将其修改成其他符号,如:“delimiter |”。在MySQL看来所有的语句可以分为两类,一类是SQL Statement(SQL语句),一类是Command Statement(系统命令)。
  系统命令无需在语句结尾处添加分号直接回车即可,通常情况下长格式的系统命令在行尾添加分号不会影响命令的正常执行,如:use test;。习惯了每敲一条命令都打一个分号的管理员和程序员们现在注意了,分号不要随便敲,MySQL在这里给我们挖了一个坑。
  让我们来看一个案例:
  使用mysqldump命令导出一个名为"pp#idhuishou"的表,mysqldump -uroot -p test pp#idhuishou -r pp#idhuishou.sql,文件名与表名相同都含有一个井号。 使用SOURCE命令再导入数据的时候,我又习惯性的在结尾多打了一个分号,结果敲完分号再敲回车语句不执行,如果不敲分号,语句正常执行,数据被成功灌入,显然是客户端把井号后的内容当成注释来处理了。
  

  
mysql> source pp#idhuishou.sql;
  
->
  

  


  • 变通解决办法:

    • 使用输入重定向的方式导入mysql -uroot -p test < pp#idhuishou.sql
    • 将文件重命名再SOURCE,不包含井号就不会受分号影响mv pp#idhuishou.sql>

  让我们分析一下MySQL倒底搞了什么鬼,MySQL处理一条语句首先要判断这条语句是否为系统命令,如果是系统命令会有单独的函数单独处理,如:com_warnings,com_use,com_source,com_help等。
  

  
Code:
  
static int read_and_execute(bool in interactive) {
  
for(;;) {
  
... ...
  

  

  if ((named_cmds || glob_buffer.is_empty()) && !ml_comment && !in_string && (com=find_command(line,0)))
  //find_command函数用来判断一条语句是否为系统命令
{  

  if ((*com->func)(&glob_buffer,line) > 0)
  //*com->func为一个函数指针,分别指向不同命令的函数,如com_warnings,com_use,com_source,com_help等
break;  
if (glob_buffer.is_empty())       // If buffer was emptied
  
in_string=0;
  
#ifdef HAVE_READLINE
  
if (interactive && status.add_to_history && not_in_history(line))
  
add_history(line);
  
#endif
  
continue;
  
}
  
if (add_line(glob_buffer,line,&in_string,&ml_comment)) //如果语句不是系统命令就会走到这里
  
break;
  
}
  
/* if in batch mode, send last query even if it doesn't end with \g or go */
  

  
if (!interactive && !status.exit_status)
  
{
  
remove_cntrl(glob_buffer);
  
if (!glob_buffer.is_empty())
  
{
  
status.exit_status=1;
  
if (com_go(&glob_buffer,line)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607012-1-1.html 上篇帖子: MySQL8小时连接超时断开问题 下篇帖子: MySQL优化方向&思路
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表