是否有任何数据库混淆了 NULL 和"NULL",或者它总是应用程序设计失败?



我读过几篇关于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的情况下,实际上什么都没有。

最新更新