mysql的又一个让人捉摸不透的bug?
这次就不说很多没有写博客了,因为前几天已经写过了。\^o^/
昨天我们刚讨论了关于自动化运维工作的实现方式,如果批量执行,中间出错怎么办?突然有人提出mysql支持--force,可以跳过出错继续执行。
那么我就想看看它这个功能是什么样子的,看看我能不能借鉴一下。
然后我就在一个测试机器上写入如下命令:
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf');
然后报错:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
看上去是正确的,因为第一条是有语法错误,但第二条是正确的,这个表应该多一条数据,但查了几遍都是没有,那说明根本就没有执行,为什么?不是说可以跳过么?
我换一种方法,将上面的语句放到一个sql文件中,因为考虑到这只有是在batch批量执行的时候才出现的,放到文件中肯定是批量的吧?然后执行下面的语句:
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "source sql"
结果和上面是一样的,报错依旧,数据没有插入依旧!为什么?
然后又换了一种方式:
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force < sql
啊?用这种方式,报错依旧,查了一次表,发现好像多了一条?为什么这样可以执行成功,通过-e方式指定就不能?
不行,我得看看代码
对于--force的参数解析,它将全局变量ignore_errors设置为1,表示忽略所有的错误。
发现对-e的解析是下面的代码:
case 'e':
status.batch= 1;
status.add_to_history= 0;
if (!status.line_buff)
ignore_errors= 0; // do it for the first -e only
if (!(status.line_buff= batch_readline_command(status.line_buff, argument)))
return 1;
break;
这里可以看到,处理-e时可能会将变量ignore_errors设置为0,这是在status.line_buff=NULL的情况下,但看了一下代码,如果有-e,则蓝色字体是设置status.line_buff的最早位置,那说明上面的ignore_errors肯定会被设置为0啊!!!
这么说来,我在命令中必须要将--force放到-e后面去?将上面出错的命令中--force放在-e后面重试一下?
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf'); --force
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql -e "source sql" --force
此时执行发错,报错依旧,但正确的插入语句执行成功了!!!难道这是个bug?
突然又想到,这是不是故意这样子,而我才疏学浅不知道?那我看看文档怎么写的:
• --execute=statement [237], -e statement
Execute the statement and quit. The default output format is like that produced with --
batch [235]. See Section 4.2.3.1, “Using Options on the Command Line”, for some examples.
With this option, mysql does not use the history file.
• --force [237], -f
Continue even if an SQL error occurs.
这完全没有说啊!!
随便提一个改法啊,这是随便提的,没有深入研究,别批我就好了
if (!status.line_buff)
ignore_errors= 0; // do it for the first -e only
if (!(status.line_buff= batch_readline_command(status.line_buff, argument)))
return 1;
将上面4行中的前面2行放到后面2行之后去,换一下位置,这样先初始化status.line_buff就不会出现这个问题了。
mysql代码的bug还是比较多的。
mysql的又一个让人捉摸不透的bug?的更多相关文章
- 如何写出一个让人很难发现的bug?
程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 -新手开发+ ...
- 如何隐藏一个让人很难发现的bug?
程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 - 新手开发 ...
- mysql如何设置一个字段,里面是自增的序号(1,2,3,..........)。
[遇到问题] [可忽略] 想把以前写的留言板搬到我的网站上去,所以要在Mysql上创建一个一mu一样的数据库,表单,字段..................... userid这个字段忘记了如何添加, ...
- java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结
2016-09-0111:06:53 使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...
- mysql中添加一个和root一样的用户用于远程连接
mysql中添加一个和root一样的用户用于远程连接: 大家在拿站时应该碰到过.root用户的mysql,只可以本地连,对外拒绝连接. 下面语句添加一个新用户administrtor: CREATE ...
- 一个IT人士的个人经历,给迷失方向的朋友
这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能 ...
- MySQL数据库添加一个字段
MySQL数据库添加一个字段 1.添加一个字段 alter table tableName add 列名 数据类型; 2.添加一个字段设置默认值 alter table tableName add ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
随机推荐
- Android_strings.xml显示特殊字符
项目中要在string.xml 中显示特殊符号,如@号冒号等,直接写肯定不行啦..只能考虑使用ASCII码进行显示: @号 @ :号 : 空格 以下为常见的ASCII十进制交换编码: --> ...
- Word在转PDF的过程中如何创建标签快速方便阅读(图文详解)
不多说,直接上干货! 选择如下 成功! 欢迎大家,加入我的微信公众号:大数据躺过的坑 人工智能躺过的坑 同时,大家可以关注我的个人博客: http://www.cnbl ...
- 解决Maven工程install时[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources
一.背景 最近的项目在用maven 进行install的时候,发现老师在控制台输出警告:[WARNING] Using platform encoding (UTF-8 actually) to co ...
- Tomcat8源码编译及导入Eclipse中研究
最近因为需求需要修改Tomcat中的某些功能,无奈只能研究那部分源码然后稍作修改. 目前Tomcat最新版是8.0,下载了源码包,编译并导入Eclipse中研究比较方便. 1. Tomcat8源码编译 ...
- Andrew Ng机器学习课程笔记(六)之 机器学习系统的设计
Andrew Ng机器学习课程笔记(六)之 机器学习系统的设计 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7392408.h ...
- quartz ? * 区别
官方文档上提到问号时是这样说的: The '?' character is allowed for the day-of-month and day-of-week fields. It is use ...
- mac 上位Idea 配置Project SDK
问题 刚开始没有Project SDK 方法 添加SDK: /Library/Java/JavaVirtualMachines/jdkXYZ_VERSION.jdk/Contents/Home/jre ...
- JS DOM操作(五) Window.docunment对象——操作元素
定位: var a = document.getElementByIt( "id" ) 同辈元素 var b = a.nextSibling; -- 找 a ...
- Oracle数据库基本常用命令汇总
1.得到数据库名和创建日期SELECT name, created, log_mode, open_mode FROM v$database; 2.ORACLE数据库的计算机的主机名,ORACLE数据 ...
- git 撤销add和commit
有时候改完代码发现改错分支了,而这个时候已经add或者commit了,怎么办,有办法: 1.若果已经add . 了这个时候可以使用git stash命令,具体操作命令如下: (1) > git ...