Ma-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:19:42 26 4
gpt4 key购买 nike

我读过几篇关于 license plate value of NULL 的文章(关于 Droogie 中的 DEF CON 27 ),包括 Humble Pi Little Data 的一部分> Matt Parker(谈论 Steve Null),其中在数据库中存储字符串值“NULL”匹配 NULL 值。

对于我使用过的数据库(至少 AFAIK),"NULL" isn't the same as a NULL 值。字段的状态是来自值的 NULL is stored separately

像SQL一样

SELECT bar 
FROM foo
WHERE foobar IS NULL;

会不同于

SELECT bar 
FROM foo
WHERE foobar = 'NULL';

当我第一次听到这些故事时,我认为它们一定是都市传说,但是在看到更多之后,我想我是否错过了什么?是否某些数据库不区分“NULL”和 is NULL(如果是,哪些是当前数据库)?还是构建数据库应用程序的人将“NULL”存储为 NULL 值的字符串或其他一些糟糕的设计?

进一步阅读:

总结一下我的问题:

  • 某些数据库是否错误处理 NULL 与“NULL”?
    • 这只是历史数据库,还是当前的数据库也这样做?
  • 从架构 POV 来看,“NULL”等于 IS NULL 是否合乎逻辑?
  • 或者所有这些都是应用程序设计失败的例子?
    • 你怎么能把事情搞得那么糟?

我真的很想看到一些混淆 NULL 和“NULL”的 SQL 示例。

最佳答案

您描述的是两个不同的概念:

  • 在关系数据库中,'null' 是一个 CHAR 值(长度为 4),就这么简单。

  • 另一方面,null 不是一个值,而是表示一个“缺失值”。这也不是没有值(value);这意味着“该值确实存在,但我们未能恢复它。”

因此,它们是截然不同的概念。我不知道有哪个数据库会在您提供时错误处理空值。但是,我可以想到不能很好区分它们的应用程序。我会考虑应用程序的缺陷,而不是数据库引擎本身的缺陷。

无论如何,这里有几个 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 中所见。

关于sql - 是否有任何数据库混淆了 NULL 和 "NULL",或者它总是应用程序设计失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63584250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com