是否有任何数据库得到 NULL 和 "NULL" 混淆,或者它总是应用程序设计失败?
Do any databases get NULL and "NULL" confused, or is it always an application design failure?
我读过几篇关于 license plate value of NULL (about Droogie from DEF CON 27), including part of chapter three Little Data in the book Humble Pi by Matt Parker (talking about Steve Null) 的文章,其中在数据库中存储字符串值“NULL”匹配 NULL 值。
使用我使用过的数据库(至少 AFAIK),"NULL" isn't the same as a NULL value. The state of a field being 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 值的字符串或其他一些糟糕的设计?
延伸阅读:
- BBC on Jennifer Null
- Mashable on Droogie's DEF CON Talk
- Matt Parker on Steve Null
- Passing NULL as a surname in SOAP
- Droogie's Go NULL Yourself talk from Def Con 27
- Droogie finally got his plate renewed
总结一下我的问题:
- 某些数据库是否错误处理 NULL 与“NULL”?
- 是否只有历史数据库,或者是否有当前的数据库做同样的事情?
- 架构 POV 中的“NULL”等于 IS NULL 是否有合理的理由?
- 或者所有这些都是应用程序设计失败的例子?
- 你怎么能把事情搞得这么糟?
我真的很想看到一些 SQL 混淆 NULL 和 'NULL' 的例子。
这是一个设计缺陷。 “NULL”是一个字符串,您不必使用字符串来表示 Nothing。因此,在 1 种情况下,您正在寻找一个完全为“NULL”的填充值,其中 IS NULL 实际上什么也没有。
您描述的是两个不同的概念:
在关系数据库中 'null'
是一个 CHAR
值(长度为 4),就这么简单。
另一方面null
不是一个值,而是代表一个“缺失值”。这也不是没有价值;这意味着“该值确实存在,但我们无法恢复它。”
因此,它们是截然不同的概念。我不知道有哪个数据库会在您提供时错误处理空值。但是,我可以想到不能很好区分它们的应用程序。我会考虑应用程序的缺陷,而不是数据库引擎本身的缺陷。
无论如何,这里有几个 SQL PostgreSQL 表达式和它们的值来说明上面的定义:
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 中所见。
我读过几篇关于 license plate value of NULL (about Droogie from DEF CON 27), including part of chapter three Little Data in the book Humble Pi by Matt Parker (talking about Steve Null) 的文章,其中在数据库中存储字符串值“NULL”匹配 NULL 值。
使用我使用过的数据库(至少 AFAIK),"NULL" isn't the same as a NULL value. The state of a field being 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 值的字符串或其他一些糟糕的设计?
延伸阅读:
- BBC on Jennifer Null
- Mashable on Droogie's DEF CON Talk
- Matt Parker on Steve Null
- Passing NULL as a surname in SOAP
- Droogie's Go NULL Yourself talk from Def Con 27
- Droogie finally got his plate renewed
总结一下我的问题:
- 某些数据库是否错误处理 NULL 与“NULL”?
- 是否只有历史数据库,或者是否有当前的数据库做同样的事情?
- 架构 POV 中的“NULL”等于 IS NULL 是否有合理的理由?
- 或者所有这些都是应用程序设计失败的例子?
- 你怎么能把事情搞得这么糟?
我真的很想看到一些 SQL 混淆 NULL 和 'NULL' 的例子。
这是一个设计缺陷。 “NULL”是一个字符串,您不必使用字符串来表示 Nothing。因此,在 1 种情况下,您正在寻找一个完全为“NULL”的填充值,其中 IS NULL 实际上什么也没有。
您描述的是两个不同的概念:
在关系数据库中
'null'
是一个CHAR
值(长度为 4),就这么简单。另一方面
null
不是一个值,而是代表一个“缺失值”。这也不是没有价值;这意味着“该值确实存在,但我们无法恢复它。”
因此,它们是截然不同的概念。我不知道有哪个数据库会在您提供时错误处理空值。但是,我可以想到不能很好区分它们的应用程序。我会考虑应用程序的缺陷,而不是数据库引擎本身的缺陷。
无论如何,这里有几个 SQL PostgreSQL 表达式和它们的值来说明上面的定义:
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 中所见。