SQL Server: Null VS空字符串



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

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

这里有一篇详细的文章讨论了一行的实际情况

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

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

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

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

在sql server中小心使用null和检查不等式

例如

select * from foo where bla <> 'something' 

将不返回bla为空的记录。尽管从逻辑上讲它应该。

所以正确的检查方法是
select * from foo where isnull(bla,'') <> 'something' 

当然,人们经常忘记,然后得到奇怪的虫子。

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

NULL -表示我们不知道这个值是什么,它可能存在,也可能不存在,我们就是不知道。

Empty-String -表示我们知道该值是什么,并且它是空的。

下面是一个简单的例子:假设您有一个包含人名的表,其中包括first_namemiddle_namelast_name的单独列。在first_name = 'John', last_name = 'Doe',并且middle_name为NULL的场景中,这意味着我们不知道中间名是什么,或者它是否存在。将该场景更改为middle_name = "(即空字符串),现在它意味着我们知道没有中间名。

我曾经听到一个SQL Server讲师提倡将数据库中的每个字符类型列都设置为必需的,然后为每个"(空字符串)"或"未知"分配一个默认值。在陈述这一点时,讲师表明他对null和空字符串之间的区别没有清楚的理解。不可否认,这些区别似乎令人困惑,但对我来说,上面的例子有助于澄清这些区别。此外,在编写SQL代码时理解它们的区别,并正确处理null和空字符串也很重要。

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

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

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

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

如果它不是外键字段,不使用空字符串可以节省一些麻烦。只有当你认为null的含义与空字符串不同时,才允许使用null。例如,如果您有一个密码字段,空值可能表示新用户尚未创建密码,而空varchar可能表示密码为空。对于像"address2"这样的字段,允许为空只会让事情变得困难。需要注意的事情包括null引用和Vagif Verdi提到的=和<>操作符的意外结果,注意这些事情通常是不必要的程序员开销。

编辑:如果性能是一个问题,请参阅这个相关问题:可空vs.非空varchar数据类型-哪个查询更快?

在有something告诉你,是否一个值在VARCHAR列有什么或没有,我写了一个函数,我用为我决定。

CREATE FUNCTION [dbo].[ISNULLEMPTY](@X VARCHAR(MAX))
RETURNS BIT AS
BEGIN
    DECLARE @result AS BIT
    IF @X IS NOT NULL AND LEN(@X) > 0
        SET @result = 0
    ELSE
        SET @result = 1
        
    RETURN @result
END

现在毫无疑问了。

如何"NULL"one_answers"空varchar"值存储在SQL Server。你为什么想知道这个?或者换句话说,如果你知道答案,你会如何使用这些信息?

如果我没有用户输入的字符串字段在我的UI,我应该存储一个NULL或" ?这取决于你所在领域的性质。请自问空字符串是否为您的字段的有效值。

如果是(例如,地址中的姓氏),那么这可能是您想要存储的内容(取决于您是否知道该地址没有姓氏)。

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

最新更新