一、前言
最近经常碰到开发误删除误更新数据,这不,他们又给我找了个麻烦,我们来看下整个过程。
二、过程
由于开发需要在生产环节中修复数据,需要执行120条SQL语句,需要将数据进行更新
于是开发连上了生产数据库,首先执行了第一条SQL

我们仔细看了下,这个SQL,的确没有什么问题,where条件也是正常的,大意就是将这个地址的前面加个bj1062,是真的没有错误么?是的没有错误。开发执行完成后,结果的确是符合预期。
然后开发执行了剩下的SQL,都是和上面的SQL一样,将地址进行更新。执行完成后,开发懵逼了,发现source_name都变成了0,开发赶紧给我打电话说:Harvey,我执行了upDate,where条件都是对的,set的值也是对的,但是set后的字段全部都变成了0,你赶紧帮我看看,看看能不能恢复数据。
我赶紧登上 服务器 ,查看了这段时间的binlog,发现了大量的Update tablename set source_name=0的语句,利用mysql2binlog进行了解析,项目地址:
赶紧和开发确定了操作的时间点,生成flashback的SQL,进行了数据恢复。
然后将开发执行的SQL拿了过来,进行了check,发现了几条很诡异的SQL:
这几条SQL的引号位置跑到了where 字段名字后面,简化后的SQL变成了:
那么这个SQL在MySQL他是如何进行语义转化的呢?
可能是下面这样的么?
这样就语法错误了,那么只会是下面这样的形式,
而
的值是0,所以就有原来的所有结果记录都变成了0.
我们研究下select形式这种语句会怎么样。
我们发现,这个SQL将str_col=’aaa’的记录也查找出来了,为什么呢?
这里他把where条件转化成了
这个条件的意思就变成了str_col 字段的值需要等于’xxx’,如果相等,那么是1,不相等,就是0,再和’yyy’进行判断,
由于等号一边是int,另外一边是字符串,两边都转化为float进行比较,可以看我之前的一篇文章
MySQL中隐式转换导致的查询结果错误案例分析
这样导致结果恒成立,也就是select语句等价于以下SQL
将查询出所有的记录。
三、小结
在写SQL的过程中,一定要小心引号的位置是否正确,有时候引号位置错误,SQL依然是正常的,但是却会导致执行结果全部错误。在执行前必须在测试环境执行测试,结合IDE的语法高亮发现相应的问题。
这个问题怎么解决,谢谢!!! - 技术问答
= =$result = mysql_query(你的sql);while($all = mysql_fetch_assoc($result)){$date[]=$all;}html里这样写$value)>>这样就可以了啊
详细讲解如何删除Access数据库中的空记录
展开全部可以使用零长度字符串来表明您知道该字段没有值。 输入零长度字符串的方法是键入两个彼此之间没有空格的双引号 ( )。 )。 在连接到 Microsoft SQL Server 数据库的 Microsoft Access 项目 (Microsoft Access 项目:与 Microsoft SQL Server 数据库连接且用于创建客户/服务器应用程序的 Access 文件。 项目文件中不包含任何数据或基于数据定义的对象(如表或视图)。 )中,可以在其数据类型 (数据类型:决定字段可拥有的数据类型的字段特征。 数据类型包括 Boolean、Integer、Long、Currency、Single、Double、Date、String 和 Variant(默认)。 )为 varchar 或 nvarchar 的字段中输入零长度字符串。 打开数据表 (“数据表”视图:以行列格式显示来自表、窗体、查询、视图或存储过程的窗口。 在“数据表”视图中,可以编辑字段、添加和删除数据,以及搜索数据。 ),或在“窗体”视图 (“窗体”视图:一个显示窗体以便显示或接受数据的窗口。 “窗体”视图是添加和修改表中数据的主要方式。 在该视图中还可以更改窗体的设计。 )中打开窗体。 若要在字段中输入零长度字符串,请键入中间不带空格的双引号 ( )。 即使在移到其他字段或对象时双引号将消失,但该字段仍为零长度字符串。 Null值与零长度字符串的区别 (MDB)。 /*注释 本主题中的信息仅适用于 Microsoft Access 数据库 ()。 */ 在查看含有 Null (Null:可以在字段中输入或用于表达式和查询,以标明丢失或未知的数据。 在 Visual Basic 中,Null 关键字表示 Null 值。 有些字段(如主键字段)不可以包含 Null 值。 ) 值和零长度字符串 (零长度字符串:不含字符的字符串。 可以使用零长度字符串来表明您知道该字段没有值。 输入零长度字符串的方法是键入两个彼此之间没有空格的双引号 ( )。 )的数据时,字段看起来是相同的,都没有任何值。 但可以用表达式 (表达式:算术或逻辑运算符、常数、函数和字段名称、控件和属性的任意组合,计算结果为单个值。 表达式可执行计算、操作字符或测试数据。 )来区分 Null 值和零长度字符串。 在“设计”视图 (“设计”视图:显示数据库对象(包括:表、查询、窗体、宏和数据访问页)的设计的窗口。 在“设计”视图中,可以新建数据库对象和修改现有数据库对象的设计。 )中打开窗体、报表或数据访问页。 在查询设计网格 (设计网格:在查询“设计”视图或“高级筛选/排序”窗口中设计查询或筛选时所用的网格。 对于查询,该网格以前称为“QBE 网格”。 )的字段中,或在未绑定控件 (未绑定控件:未与基础表、查询中的字段或 SQL 语句连接的控件。 未绑定控件通常用于显示信息性文本或装饰性图片。 )的控件来源中,键入下列表达式。 将 fieldname 替换为包含 Null 值和零长度字符串的字段名称。 =IIf(IsNull([fieldname]),Unknown,Format([fieldname],@;\ZLS))如果字段包含 Null,则表达式返回 “Unknown”,如果字段包含零长度字符串,则表达式返回“ZLS”。 否则,表达式将值返回到该字段中。 事情出现在工作中一次抓取网上信息的时候,可能考虑不全,抓到库中的信息有部分是空的,这样,我的必需将空的记录删除,试了好多办法不行,最后才找到了上面的微软的ACCESS帮助文档才解决问题。 执行代码片断后,此问题解决。
Adodc1连接数据库进行查询
(年级= & & ’) (班级= & & ’) (专业= & & ’)...另外还要加上数据库更新语句或其它程序的逻辑问题你自己再考虑下是否合理。
发表评论