Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 为什么DB可以放弃我的字符串数据_Sql_Sql Server_Oracle - Fatal编程技术网

Sql 为什么DB可以放弃我的字符串数据

Sql 为什么DB可以放弃我的字符串数据,sql,sql-server,oracle,Sql,Sql Server,Oracle,好的,我在四处寻找时感到沮丧,所以我会在这里问。 我所研究的是MS sqlserver中的CONCAT_NULL_YIELDS_NULL设置 我不得不在sqlserver上编写一个查询/存储过程,该过程中出现了异常行为 现在我几乎所有使用数据库的经验都在Oracle中,所以我最终发现,令我惊讶的是,MS故意丢弃了我的数据 您可以看到,我将值串联在一起,形成一个用于日志记录/调试的字符串,每次发生任何有趣的事情时,我都只得到null 所以我的问题实际上有两个: a) 如果其中一个数据为空,为什么人

好的,我在四处寻找时感到沮丧,所以我会在这里问。 我所研究的是MS sqlserver中的CONCAT_NULL_YIELDS_NULL设置

我不得不在sqlserver上编写一个查询/存储过程,该过程中出现了异常行为

现在我几乎所有使用数据库的经验都在Oracle中,所以我最终发现,令我惊讶的是,MS故意丢弃了我的数据

您可以看到,我将值串联在一起,形成一个用于日志记录/调试的字符串,每次发生任何有趣的事情时,我都只得到null

所以我的问题实际上有两个: a) 如果其中一个数据为空,为什么人们要扔掉所有数据? b) 其他DB引擎是否也有此缺陷,或者只是MS


我不想在这里被嘲笑,我真的无法理解为什么这是可以接受的。

您将字符串连接在一起,null不是字符串。空就是空。它是它自己的类型,因此尝试将它连接到字符串应该需要显式转换为字符串类型,因为没有隐式转换

设置CONCAT_NULL_generations_NULL是为了根据SQL标准,为尝试将NULL连接到字符串的行为提供一致且预期的响应

如果此设置处于禁用状态,则SQL Server中的计算列和索引将失败,并且MS将在未来版本中更改SQL Server以使其处于禁用状态,从而无法禁用此设置


事实上,NULL就像一个黑洞。。。NULL加上任何东西都等于NULL。您也不能针对NULL测试值,因为NULL不等于任何其他值(甚至另一个NULL)。这就是为什么必须使用单独的语法“is NULL”和“is NOT NULL”

从本质上说,数据库并不是“扔掉你的数据”,而是完全按照你的要求去做。如上所述,注释“未知”加上任何已知的结果都会导致“未知”值。。。i、 e.无效


如果这是一个问题,请确保使用COALESCE()或ISNULL()函数将空字符串转换为空字符串。问题已解决。

从包含
NULL
(例如,
1+NULL+3
是标准SQL中非常常见的场景,这是一个设计决策。您是在谈论一些没有文档记录和/或没有意义的特定功能吗?这是大多数数据库的基本功能。如何添加
NULL
(没有类型或值的东西)有什么关系吗?
NULL
Char(10)
的结果会是什么?添加到Char中的未知内容将是未知的(就像用标记为“精子”的试管中没有物种的内容物使实验大鼠怀孕的结果).A
NULL
INTEGER
也会导致未知值。其基本逻辑是:如果添加未知值和已知值,则得到未知值。这是SQL标准所要求的:任何包含NULL的表达式都必须返回NULL。不知道SQL Server是否有它,但有一个
concat()大多数DBMS thta中的
函数将NULL视为空字符串。该标准要求DB引擎丢弃已“污染”的数据可能是因为你在Oracle的背景使你认为空字符串和空字符串比其他更标准的系统中的字符串更等效。人们也经常会被另一种方法绊倒,当他们无法区分空字符串和零长度时,往往会非常惊讶Oracle中的字符串。无论哪种方式,只需使用ISNULL或COALESCE告诉SQL Server您要将null转换为“”。你不会花很长时间去调整。认为向任何内容添加空集都会返回不变的内容是可以的,问题是NULL既不是任何内容,也不是空集,所以你对空集和任何内容的思考都不涉及NULL,这是你问题的根源……至于你的第一段,看到NULL的另一种方式是空类型是每种类型,或无类型,任何不向某物添加任何内容的操作都会使某物保持不变。(即,在数学中,添加零而不是乘以零)我明白你的观点,有些语言会这样处理。这只是SQL标准定义中的一个选择,确定null被显式处理为null类型且无值。如果null被更像Ø一样处理,似乎会简化事情,我只需要记住不同DBs的新规则。