server教程 SQL Server:Null VS空字符串



sql server下载 (7)

如何在SQL Server中存储NULLEmpty Varchar值。 如果我的UI上没有string字段的用户条目,我应该存储NULL还是''


Answer #1

NULL值分别存储在所有列的特殊位图空间中。

如果您在应用程序中没有区分NULL'' ,那么我建议您在表中存储'' (除非字符串列是外键,在这种情况下,禁止存储列可能会更好)空字符串并允许NULL,如果它与您的应用程序的逻辑兼容)。


Answer #2

NULL是非值,如undefined。 ''是一个包含0个字符的空字符串。
数据库中字符串的值取决于UI中的值,但通常,如果在查询或存储过程中指定参数,则为空字符串''


Answer #3

如果它不是外键字段,不使用空字符串可以省去一些麻烦。 如果你将null视为与空字符串不同的东西,则只允许空值。 例如,如果您有密码字段,则空值可能表示新用户尚未创建其密码,而空varchar可能表示空密码。 对于像“address2”这样的字段,允许空值只会让生活变得困难。 需要注意的事项包括空引用和Vagif Verdi提到的=和<>运算符的意外结果,并注意这些事情往往是不必要的程序员开销。

编辑:如果性能是一个问题,请参阅此相关问题: Nullable与非null varchar数据类型 - 查询速度更快?


Answer #4

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

NULL - 意味着我们不知道它是什么,它可能存在,但它可能不存在,我们只是不知道。

Empty-String - 意味着我们知道价值是什么,它什么都不是。

这是一个简单的示例:假设您有一个包含人名的表,包括first_namemiddle_namelast_name的单独列。 在first_name ='John', last_name ='Doe'和middle_name IS NULL的情况下,这意味着我们不知道中间名是什么,或者它是否存在。 改变这种情况,使得middle_name =''(即空字符串),现在它意味着我们知道没有中间名。

我曾经听说过一个SQL Server教师提倡在数据库中创建每个字符类型列,然后为每个''(空字符串)或'未知'分配一个DEFAULT VALUE。 在陈述这一点时,讲师证明他没有清楚地理解NULL和空字符串之间的区别。 不可否认,差异似乎令人困惑,但对我来说,上面的例子有助于澄清差异。 此外,在编写SQL代码时理解差异并正确处理NULL和空字符串也很重要。


Answer #5

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


Answer #6

如何在SQL Server中存储“NULL”和“空varchar”值。 你为什么想知道这个? 或者换句话说,如果您知道答案,您将如何使用该信息?

如果我的UI上没有字符串字段的用户条目,我应该存储NULL还是''? 这取决于你的领域的性质。 问问自己,空字符串是否是您字段的有效值。

如果是(例如,地址中的房屋名称),则可能是您要存储的内容(取决于您是否知道该地址没有房屋名称)。

如果它不是(例如,一个人的名字),那么你应该存储一个null,因为人们没有空白名称(据我所知,在任何文化中)。


Answer #7

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

更新这里有一篇详细的文章,讨论了实际上连续发生的事情

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

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

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

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





sql-server