Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否有任何数据库将NULL和“NULL”混淆,或者它总是应用程序设计失败?_Sql_Database_Null_Isnull - Fatal编程技术网

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

Sql 是否有任何数据库将NULL和“NULL”混淆,或者它总是应用程序设计失败?,sql,database,null,isnull,Sql,Database,Null,Isnull,我读过几篇关于about from的文章,包括书中第三章小数据的一部分,讨论了在数据库中存储NULL字符串值与NULL值匹配的情况 对于数据库,我至少使用了AFAIK,value。字段的状态是从值开始的 非常像SQL SELECT bar FROM foo WHERE foobar IS NULL; 将不同于 SELECT bar FROM foo WHERE foobar = 'NULL'; 当我第一次听到这些故事时,我想它们一定是都市传奇,但在看了更多的故事后,我想知道我是否错过了什

我读过几篇关于about from的文章,包括书中第三章小数据的一部分,讨论了在数据库中存储NULL字符串值与NULL值匹配的情况

对于数据库,我至少使用了AFAIK,value。字段的状态是从值开始的

非常像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是一个字符串,您不必使用字符串来表示任何内容。因此,在1种情况下,您要查找的填充值正好为NULL,其中with为NULL,实际上没有任何内容。

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

在关系数据库中,“null”是长度为4的字符值,就这么简单

另一方面,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
请参阅上的运行示例


注意。当您通常与null进行比较时,结果是未知的真实值,不是真的,也不是假的。但是,大多数数据库驱动程序在将该值发送到您的应用程序时会将其转换为null,正如您在上面的案例2、3、8和9中所看到的那样。

您怎么能把它搞得这么糟呢?无知。我建议这些都是应用程序逻辑的问题,而不是底层数据库的问题。如果有人输入null字符串时应用程序中断,那个么那个应用程序可能对SQL注入非常开放。@我也这么想。但是,它似乎应该将输入读取为“NULL”,而不是NULL关键字。似乎开发人员需要故意把这搞砸。我同意DBMS在这里不太可能有任何问题,因为NULL与is和is一起使用,这使得它的使用不同于='NULL'或'NULL'。但是,您可能希望编辑您的请求,因为NULL表示没有值,“NULL”是字符串,NULL不是字符串,而是名称。这正是我所想的。但当我读到这篇文章时,他们通常试图让它听起来像是数据库错误,但这些文章通常是由非技术人员撰写的。在这个行业工作了十年后,我发现有时问题是作者试图把事情变得过于简单,因此,又使它复杂化了!实际上,NULL是一个标识符,“NULL”应该是一个字符串。它是8 0,不代表任何东西——至少在21世纪初是这样……确切地说。谢谢你做了这把小提琴。这真的很有用也很有趣。似乎有人会故意把NULL和‘NULL’搞得一团糟。我认为许多开发人员不理解/不知道Java/C/PHP NULL与SQL NULL有很大的不同。另外,Java/C/PHP布尔值有两个可能的值,而SQL布尔值有三个true、false和unknown。有一个很大的阻抗,很少有开发人员理解。还有许多ORM无法正确映射它们。2、3、8、9、11、12、13和14实际上应该引发语法错误异常。NULL关键字在语法上不能是比较运算符=、>、>=、的参数,