MySQL中一个双引号错位激发的血案
副问题[/!--empirenews.page--]
一、媒介 最近常常遇到开拓误删除误更新数据,这不,他们又给我找了个贫困,我们来看下整个进程。 二、进程 因为开拓必要在出产环节中修复数据,必要执行120条SQL语句,必要将数据举办更新 于是开拓连上了出产数据库,起首执行了第一条SQL
我们细心看了下,这个SQL,简直没有什么题目,where前提也是正常的,大意就是将这个地点的前面加字符串bj1062,是真的没有错误么?是的没有错误。开拓执行完成后,功效简直是切合预期。 然后开拓执行了剩下的SQL,都是和上面的SQL一样,将地点举办更新。执行完成后,开拓懵逼了,发明source_name都酿成了0,开拓赶忙给我打电话说: Harvey,我执行了update,where前提都是对的,set的值也是对的,,可是set后的字段所有都酿成了0,你赶忙帮我看看,看看能不能规复数据。 我赶忙登上处事器,查察了这段时刻的binlog,发明白大量的update tablename set source_name=0的语句,操作binlog2sql举办了理会,项目地点:binlog2sql 赶忙和开拓确定了操纵的时刻点,天生flashback的SQL,举办了数据规复,同时保存现场证据。 然后对开拓执行的SQL举办了check,发明白几条很诡异的SQL: 这几条SQL的引号位置跑到了where 字段名字后头,简化后的SQL酿成了:
那么这个SQL在MySQL他是怎样举办语义转化的呢? 也许是下面这样的么?
这样就语法错误了,那么只会是下面这样的情势,
而
的值是0,以是
等价于 update tbl_name set str_col=0 以是就导致了source_name字段所有更新成了0. 我们再研究下select情势这种语句会怎么样。
我们发明,这个SQL将str_col=’aaa’的记录也查找出来了,为什么呢?
这里他把 where 前提转化成了
这个前提的起首判定str_col 和’xxx’是否相称,假如相称,那么内里括号的值为1,假如不相称,就是0 然后0可能1再和和’yyy’举办判定, 因为等号一边是int,其它一边是字符串,双方都转化为float举办较量,可以看我之前的一篇文章 MySQL中隐式转换导致的查询功效错误案例说明 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |