SQL Server 中如何存储NULL
和 Empty Varchar 值。如果我的 UI 上的string
字段没有用户条目,我应该存储NULL
还是''
?
答案 0 :(得分:54)
有一篇很好的文章here讨论了这一点。需要注意的关键是表大小没有区别,但有些用户更喜欢使用空字符串,因为它可以使查询更容易,因为没有NULL检查。您只需检查字符串是否为空。需要注意的另一件事是NULL在关系数据库的上下文中意味着什么。这意味着指向字符字段的指针在行的标题中设置为0x00,因此无法访问数据。
<强>更新强> 有一篇详细的文章here,其中讨论了实际上在行中发生的事情
每行对于允许空值的列都有一个空位图。如果排在 该列为空,然后位图中的位为1,否则为0。
对于可变大小的数据类型,实际大小为0字节。
对于固定大小的数据类型,acctual大小是默认的数据类型大小 以字节为单位设置为默认值(0代表数字,''代表字符)。
DBCC PAGE的结果显示 NULL和空字符串都占用零字节。
答案 1 :(得分:34)
小心空字符并检查sql server中的不等式。
例如
select * from foo where bla <> 'something'
不会返回bla为null的记录。尽管逻辑上它应该。
所以检查的正确方法是
select * from foo where isnull(bla,'') <> 'something'
当然,人们经常会忘记,然后会发现奇怪的错误。
答案 2 :(得分:13)
空字符串是长度为零或没有字符的字符串。
Null
缺少数据。
答案 3 :(得分:6)
NULL和“空字符串”之间的概念差异在数据库设计中是真实且非常重要的,但经常被误解和不正确地应用 - 这里是对这两者的简短描述:
NULL - 表示我们不知道该值是什么,它可能存在,但它可能不存在,我们只是不知道。
空字符串 - 表示我们知道该值是什么,而且它什么都没有。
这是一个简单的例子: 假设您有一个包含人名的表,包括 first_name , middle_name 和 last_name 的单独列。在 first_name ='John', last_name ='Doe'和 middle_name IS NULL的情况下,这意味着我们不知道是什么中间名是,或者甚至存在。更改该场景,使 middle_name =''(即空字符串),现在它意味着我们知道没有中间名。
我曾经听过一位SQL Server教师提倡在数据库中创建每个字符类型列,然后为每个''(空字符串)或'未知'分配一个默认值。在说明这一点时,讲师证明他没有清楚地理解NULL和空字符串之间的区别。不可否认,差异似乎令人困惑,但对我来说,上面的例子有助于澄清差异。此外,了解编写SQL代码时的区别,并正确处理NULL和空字符串也很重要。
答案 4 :(得分:2)
NULL值分别存储在所有列的特殊位图空间中。
如果您在应用程序中没有区分NULL
和''
,那么我建议您在表中存储''
(除非字符串列是外键,在哪种情况下,禁止列存储空字符串并允许NULL(如果它与应用程序的逻辑兼容)可能会更好。
答案 5 :(得分:1)
NULL
是非值,如未定义。 ''
是一个空字符串,带有0个字符
数据库中字符串的值取决于UI中的值,但通常,如果在查询或存储过程中指定参数,则为空字符串''
。
答案 6 :(得分:1)
如果它不是外键字段,不使用空字符串可以省去一些麻烦。如果你将null视为与空字符串不同的东西,则只允许空值。例如,如果您有密码字段,则空值可能表示新用户尚未创建其密码,而空varchar可能表示空密码。对于像“address2”这样的字段,允许空值只会让生活变得困难。需要注意的事项包括空引用和=和&lt;&gt;的意外结果Vagif Verdi提到的运营商,注意这些事情往往是不必要的程序员开销。
编辑:如果效果有问题,请参阅此相关问题:Nullable vs. non-null varchar data types - which is faster for queries?
答案 7 :(得分:-2)
SQL Server中如何存储“NULL”和“空varchar”值。 你为什么想知道这个?或者换句话说,如果你知道答案,你将如何使用这些信息?
如果我的UI上没有字符串字段的用户条目,我应该存储NULL还是''? 这取决于你的领域的性质。问问自己,空字符串是否是您字段的有效值。
如果是(例如,地址中的房屋名称),则可能是您要存储的内容(取决于您是否知道该地址没有房屋名称)。
如果不是(例如,一个人的姓名),那么你应该存储一个空值,因为人们没有空白名称(据我所知,在任何文化中)。