NULL与空字符串

时间:2012-02-25 14:03:35

标签: sql-server

以下查询之间的区别是什么?它是如何工作的?

SELECT * FROM some_table WHERE col IS NOT NULL 

&安培;

SELECT * FROM some_table WHERE col <> ''

此致 拉克

6 个答案:

答案 0 :(得分:8)

NULL是特殊数据类型,意味着没有价值。

另一方面,空字符串表示字符串或值为空。

两者都不同。

例如,如果表格中有name字段,默认情况下您已将其设置为NULL。如果没有为它指定任何值,它将是NULL但如果您指定实名或空字符串,则它不会是NULL,而是包含空字符串。

答案 1 :(得分:5)

NULL缺乏价值,通常表示有意义的事情,例如未知或未确定。例如,如果我今天启动项目,则StartDate2012-02-25。如果我不知道该项目需要多长时间,那么EndDate应该是什么?我可能知道ProjectedEndDate可能是什么,但我会将EndDate设置为NULL,并在项目完成时更新它。

''是一个零长度(或“空”)字符串。技术上并不缺少数据,因为它实际上可能是有意义的。例如,如果我没有中间名,则根据您的数据模型''可能比NULL更有意义,因为后者意味着未知但''可能意味着它已知我没有。 NULL当然可以以相同的方式使用,但是很难解释它是否存在,或者知道它是否存在。许多标准都有可能未知的事物的专用值 - 例如Gender我相信9个不同的字符代码,因此如果未指定MF,我们总是确切知道为什么(未知,未指明,变性等)。还要考虑HeartRateNULL的情况 - 它是因为没有脉冲,还是因为我们还没有采用它?

它们不尽相同,但遗憾的是很多人对它们的看法相同。如果您的列允许NULL,则表示您事先知道有时您可能不知道此信息。如果您不是将它们视为同一个东西,那么您的查询会有所不同。例如,如果col不允许NULL,则您的第一个查询将始终返回表中的所有结果,因为它们都不能是NULL。但是NOT NULL仍允许输入空字符串,除非您还设置了检查约束以防止零长度字符串。

对于尝试理解数据模型的人来说,同时允许两个列通常有点令人困惑,但我相信在大多数情况下,NOT NULL约束不会与LEN(col)>0检查约束相结合。如果两者都被允许则存在的问题是,如果列为NULL或列为“空”,则很难知道它意味着什么 - 它们可以表示同样的事情,但它们可能不是 - 这会因商店而异。

另一个关键点是NULL与任何事物(至少在SQL Server *中默认情况下)进行比较,评估为未知,而后者的计算结果为false。例如,这些查询 all 返回0

DECLARE @x TABLE(i INT);
INSERT @x VALUES(NULL);

SELECT COUNT(*) FROM @x WHERE i = 1;
SELECT COUNT(*) FROM @x WHERE i <> 1;
SELECT COUNT(*) FROM @x WHERE i <= 3;
SELECT COUNT(*) FROM @x WHERE i > 3;
SELECT COUNT(*) FROM @x WHERE i IN (1,2,3);
SELECT COUNT(*) FROM @x WHERE i NOT IN (1,2,3);

由于where子句中的比较总是评估为未知,因此它们总是返回false,因此没有行符合条件,所有计数都返回0

此外,dba.stackexchange上这个问题的答案可能很有用:

https://dba.stackexchange.com/questions/5222/why-shouldnt-we-allow-nulls

*您可以使用SET ANSI_NULLS OFF更改此内容 - 但不建议这样做,因为它提供了非标准行为,因为这个“功能”has been deprecated since SQL Server 2005并且将成为不op在SQL Server的未来版本中。但您可以使用上面的查询,看到NOT INSET ANSI_NULLS OFF的行为不同。

答案 2 :(得分:2)

NULL表示缺少值,但''表示值存在,但只是空字符串 所以第一个查询意味着查询col值没有丢失的所有行,第二个意味着选择那些col不等于空字符串的行

更新

有关详细信息,建议您阅读本文:

https://sqlserverfast.com/blog/hugo/2007/07/null-the-databases-black-hole/

答案 3 :(得分:1)

Select * from table where col IS NOT NULL将返回从Select * from table where col <> ‘’排除的结果,因为空字符串也是非NULL。

答案 4 :(得分:0)

http://data.stackexchange.com/stackoverflow/query/62491/http-stackoverflow-com-questions-9444638-null-vs-empty-in-sql-server

SET NOCOUNT ON;
DECLARE @tbl AS TABLE (value varchar(50) NULL, description varchar(50) NOT NULL);

INSERT INTO @tbl VALUES (NULL, 'A Null'), ('', 'Empty String'), ('Some Text', 'A non-empty string');

SELECT * FROM @tbl;
SELECT * FROM @tbl WHERE value IS NOT NULL;
SELECT * FROM @tbl WHERE value <> '';

请注意,在显示中您无法区分NULL和'' - 这只是网格和文本客户端如何显示数据的工件,但是集合中的数据以不同的方式存储为NULL和''。

答案 5 :(得分:0)

如其他答案中所述,NULL表示“无值”,而空字符串''表示空字符串。您可以将允许NULLs的字段视为可选字段 - 可以忽略它们,并且可能无法提供它们的值。

想象一下,一个应用程序,被访者选择他们的头衔(先生,夫人,小姐,博士),但你不需要他/她选择任何一个并留空。在这种情况下,您将NULL置于相关的数据库字段中。

NULL和空字符串之间的区别可能并不明显,因为如果您决定,它们都可能意味着“没有价值”。这完全取决于您,但使用NULL会更好,主要是因为它是数据库的特殊情况,旨在快速有效地处理NULL(比字符串快得多)。如果您使用它而不是空字符串,您的查询将更快,更可靠。