暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库之泪第一章节

四海内皆兄弟 2022-05-25
398

 幸福的家庭似乎都一样的美好无可挑剔,不幸福的家庭总是有各种各样的不和谐,各种各样的灾难或痛苦。 出处:俄国 列夫·托尔斯泰 《安娜·卡列尼娜》第一章第一句话。


    解析:列夫·托尔斯泰的这句“幸福的家庭都是相似的,不幸的家庭各有各的不幸”和中国的俗语“家家有本难念的经”有异曲同工之妙。每一个家里都有一些旁人不为所知的难事,每个家庭都有别人所不同的烦恼。看着貌似很幸福的家庭,也有自己的烦恼事,只不过没有说出来而已。

   有一次我在我的群里说这话时候信通院的刘老师说可以写个专题。今天先开个头吧。 计算机是二进制的,只认识 0和1,连2都不认识。所以很多时候是真假的判断。数据库也是计算机的一个分支,也不例外。

一般开发写SQL,select * from t where 1=1.这是为了后续增加条件 and t.id=1这样的继续往后添加。

1、如果单独1=1这样是恒等于真所以这样是全表查询。这种是有意而为之。

2、如果 select * from t where t.id=1 or 1=1 ,由于or是或的关系,而1=1又是恒为真,又是全表。而这个就是SQL注入的一个典型体现。

3、如果select * from t where t.id>1,那么也是恒为真,返回所有符合条件的。只不过是id大约1的几乎是所有的,如果有一亿条数据,那么就是返回1亿数据。

4、如果select * from t where t.id!=1,那么也是恒为真,返回所有符合条件的。同上。

以上可能还算常见, 接下来可能就是大家没见过的。

5、如果select * from t where  1-1 and 其他条件。说真的我第一次见到1-1.这是什么操作?后来想想,想通了,键盘上=和-是挨着的,开发不仔细,本来是想1=1结果变成了1-1.那么就是select * from t where  0


0代表为假。所以全部不显示。而这种不报错的是可以执行的,只是执行了个寂寞。


6、由于疏忽漏写,基于刚才的大家知道select * from t where 1是全部,0是什么都不做。

那么如果本来想 update t set name='1' where id=1;结果写错了update t set name='1' where 1呢?

期望是下面的图。



漏写了id=1,而执行就变成了这样。


这个时候就希望是Oracle吧。还能给你用闪回找回。其他数据库指望备份也不可能恢复出错之前,还需要一些工作量,甚至较大的工作量。如果这个表有几千万上亿。那真的就呵呵了。


5和6是我们不常见的问题,但是只有你想不到的,没有开发做不到的。这就是数据库流下的泪水。


文章转载自四海内皆兄弟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论