SQL Server:Null VS空字符串

Akr*_*hda 62 sql-server

如何在SQL Server中存储NULLEmpty Varchar值.如果我的UI上的某个字段没有用户条目,我应该存储一个还是一个?stringNULL''

ope*_*hac 57

有一个很好的文章在这里,其中讨论了这一点.需要注意的关键是表大小没有区别,但有些用户更喜欢使用空字符串,因为它可以使查询更容易,因为没有NULL检查.您只需检查字符串是否为空.需要注意的另一件事是NULL在关系数据库的上下文中意味着什么.这意味着指向字符字段的指针在行的标头中设置为0x00,因此无法访问数据.

更新 有一个详细的文章在这里它谈论什么是真正发生连续的基础上

对于允许空值的列,每行都有一个空位图.如果该列中的行为null,则位图中的位为1,否则为0.

对于可变大小的数据类型,实际大小为0字节.

对于固定大小的数据类型,acctual大小是默认数据类型大小(以字节为单位)设置为默认值(0表示数字,''表示字符).

DBCC PAGE的结果显示NULL和空字符串都占用零字节.

  • "需要注意的另一件事是NULL在关系数据库的上下文中意味着什么.这意味着指向字符字段的指针在行的标题中设置为0x00,因此无法访问数据." NULL并不意味着在关系数据库的上下文中.它只意味着在一个特定供应商的关系数据库的实现中. (8认同)
  • 第一个链接被破坏了. (7认同)
  • 这并不是真正要讨论的问题。这实际上只是某人表达自己的观点,没有任何依据。他们提出的唯一一点是空间要求是相同的,这不支持任何一种方法。 (2认同)

Vag*_*rdi 35

注意空值并检查sql server中的不等式.

例如

select * from foo where bla <> 'something' 
Run Code Online (Sandbox Code Playgroud)

不会返回bla为null的记录.尽管逻辑上它应该.

所以检查的正确方法是

select * from foo where isnull(bla,'') <> 'something' 
Run Code Online (Sandbox Code Playgroud)

当然人们经常忘记然后会发现奇怪的错误.

  • @MikeTeeVee:在任何一种情况下都不是'FALSE`.它是'UNKNOWN`并且没有通过条件(只有`TRUE`结果通过). (12认同)
  • 很难接受"null = null"返回false,但是"null <>'something'"也返回false只是感觉非常残忍. (9认同)
  • 上面的查询可以稍微优化一下,它会更快一些.而不是做`select*from foo where isnull(bla,'')<>'something'`,你可以`select*from foo where(bla <>'something')或(bla is null)` (2认同)

Ken*_*ent 13

空字符串是长度为零或没有字符的字符串. Null没有数据.

  • 这是 NULL 的一种解释。在某些情况下,这显然是正确的。但是 SQL 在涉及 NULL 时并不一致,因此存在 NULL 表示未知的上下文。例如,“NULL != 'x'” 返回 NULL,因为在此上下文中 NULL 意味着未知。如果它是缺席,那就没有意义,因为“x”不等于缺席。 (4认同)
  • @Fandango68对于存储优化:我们中的一些人拥有包含数百亿行的表,并且如果一种特定表示形式(“NULL”或“N”之一)使用更少的磁盘空间或者比其他的处理速度更快_而不会影响我们的数据库设计_那么这可以节省大量的运营费用。 (2认同)

Gor*_*n J 7

NULL和“空字符串”之间的概念差异在数据库设计中是真实且非常重要的,但是经常会被误解和应用不正确-这是对两者的简短描述:

NULL-表示我们不知道该值是什么,它可能存在,但可能不存在,我们只是不知道。

空字符串 -表示我们知道值是什么,什么也不是。

这是一个简单的示例:假设您有一个包含人名的表,其中包括first_namemiddle_namelast_name的单独列。在first_name ='John',last_name ='Doe'和middle_name为 NULL的情况下,这意味着我们不知道中间名是什么,甚至不存在。更改该方案,使middle_name =''(即空字符串),现在意味着我们知道没有中间名。

我曾经听过一位SQL Server讲师提倡将数据库中的每个字符类型列都设置为必需,然后为每个''(空字符串)或“未知”分配一个默认值。在说明这一点时,讲师证明他对NULL和空字符串之间的区别没有清楚的了解。诚然,这些差异似乎令人困惑,但是对我而言,上面的示例有助于阐明差异。同样,重要的是要了解编写SQL代码时的区别,并正确处理NULL和空字符串。

  • 我想指出,这并不是普遍客观的意见。 (4认同)
  • 您在这里争论 NULL 意味着“未知”,不应该意味着“什么都没有”/“不适用”。但是其他数据类型呢?如果我们有表 CONTRACTS,其中列“maturity_date”的类型为 DATE。如果我们的合同没有到期日(例如,在要求之前存款)怎么办?在这种情况下,公认的处理方法是保留“maturity_date=NULL”。(即对于所有其他数据类型,在“无”/“不适用”的情况下,NULL 是合适的)(我的观点:null 与空字符串与特殊值只是协议约定的问题) (3认同)