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