幸福的家庭似乎都一样的美好无可挑剔,不幸福的家庭总是有各种各样的不和谐,各种各样的灾难或痛苦。 出处:俄国 列夫·托尔斯泰 《安娜·卡列尼娜》第一章第一句话。
解析:列夫·托尔斯泰的这句“幸福的家庭都是相似的,不幸的家庭各有各的不幸”和中国的俗语“家家有本难念的经”有异曲同工之妙。每一个家里都有一些旁人不为所知的难事,每个家庭都有别人所不同的烦恼。看着貌似很幸福的家庭,也有自己的烦恼事,只不过没有说出来而已。
有一次我在我的群里说这话时候信通院的刘老师说可以写个专题。今天先开个头吧。 计算机是二进制的,只认识 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是我们不常见的问题,但是只有你想不到的,没有开发做不到的。这就是数据库流下的泪水。








