我读过几篇关于NULL的车牌值(关于DEF CON 27中的Droogie(的文章,包括Matt Parker(谈论Steve NULL(的Humble Pi一书中第三章小数据的一部分;NULL";在数据库中匹配NULL值。
对于我使用过的数据库(至少AFAIK(;NULL";与NULL值不同。字段为NULL的状态与值分开存储。
所以SQL类似
SELECT bar
FROM foo
WHERE foobar IS NULL;
将不同于
SELECT bar
FROM foo
WHERE foobar = 'NULL';
当我第一次听到这些故事时,我以为它们一定是城市传说,但在看到更多的故事后,我想知道我是不是错过了什么?是不是有些数据库不区分";NULL";from为NULL(如果是,是哪一个,任何当前的(?或者是谁构建了存储";NULL";作为NULL值的字符串还是其他一些糟糕的设计?
进一步阅读:
- BBC关于Jennifer Null
- Droogie的DEF CON演讲
- 马特·帕克谈史蒂夫·诺尔
- 在SOAP中将NULL作为姓氏传递
- Droogie的Go NULL Yourself演讲来自Def Con 27
- Droogie终于换了盘子
总结我的问题:
- 某些数据库是否错误处理了NULL与";NULL"?
- 这只是历史数据库,还是目前有同样的数据库
- 是否有一个合乎逻辑的理由;NULL";等于体系结构POV中的IS NULL
- 还是所有这些都是应用程序设计失败的一个例子?
- 你怎么能把事情搞得那么糟
我真的很想看到一些混淆NULL和"NULL"的SQL的例子
您正在描述两个不同的概念:
-
在关系数据库中,
'null'
是一个CHAR
值(长度为4(,就这么简单。 -
另一方面,
null
不是值,而是表示";缺少值";。这也不是没有价值;这意味着";该值确实存在,但我们未能恢复它;
因此,它们都是非常不同的概念。我不知道有哪个数据库在你展示的时候对null处理不当。然而,我可以想到一些应用程序不能很好地区分它们。我会考虑应用程序上的缺陷,而不是数据库引擎本身。
无论如何,这里有一些PostgreSQL中的SQL表达式及其值来说明上面的定义:
select
'null' = 'null', -- 1. TRUE
'null' = null, -- 2. null (actually UNKNOWN)
'null' <> null, -- 3. null (actually UNKNOWN)
'null' is null, -- 4. FALSE
'null' is not null, -- 5. TRUE
null is null, -- 6. TRUE
null is not null, -- 7. FALSE
null = null, -- 8. null (actually UNKNOWN)
null <> null, -- 9. null (actually UNKNOWN)
null is not distinct from null, -- 10. TRUE
(null = null) is unknown, -- 11. TRUE
(null = null) is true, -- 12. FALSE
(null = null) is false, -- 13. FALSE
(null <> null) is unknown -- 14. TRUE
请参阅DB Fiddle上的运行示例。
注意。当您通常与null
进行比较时,结果是真正的值UNKNOWN
,而不是TRUE
,也不是FALSE
。但是,大多数数据库驱动程序在将该值发送到应用程序时会将其转换为null
,如您在上面的案例#2、#3、#8和#9中所看到的那样。
这是一个设计缺陷"NULL";是一个字符串,不应该使用字符串来表示Nothing。因此,在1种情况下,您正在寻找一个恰好为"0"的填充值;NULL";在IS为NULL的情况下,实际上什么都没有。