在 SQL Server 中,NULL
和空的 Varchar 值是如何存储的?如果我在我的 UI 上没有用户输入一个 string
字段,我应该存储一个 NULL
还是 ''
?
在 SQL Server 中,NULL
和空的 Varchar 值是如何存储的?如果我在我的 UI 上没有用户输入一个 string
字段,我应该存储一个 NULL
还是 ''
?
更新 这里有一篇详细的文章,谈论了每行基础上实际发生的情况
每行都有一个允许空值的列的null位图。如果该列中的行为空,则位图中的一个位为1,否则为0。
对于可变大小的数据类型,实际大小为0字节。
对于固定大小的数据类型,实际大小为默认数据类型大小(数字为0,字符为'')的字节数。
DBCC PAGE的结果显示,NULL和空字符串都占用零字节。
在 SQL Server 中,小心处理 null 值并检查不等式。
例如:
select * from foo where bla <> 'something'
将不会返回bla为null的记录,虽然从逻辑上讲应该会返回。
因此正确的检查方式是
select * from foo where isnull(bla,'') <> 'something'
当然,人们经常会忘记这一点,然后出现奇怪的错误。
select * from foo where (bla <> 'something') or (bla is null)
代替 select * from foo where isnull(bla,'') <> 'something'
。 - NicolasNULL
相同。 - Jimmy T.在数据库设计中,“NULL”和“空字符串”之间的概念差异是真实且非常重要的,但往往被误解和不当应用——以下是两者的简短描述:
NULL - 意味着我们不知道该值是什么,它可能存在,也可能不存在,我们只是不知道。
空字符串 - 意味着我们知道该值是什么,即为空。
这里有一个简单的例子: 假设您有一张包含人名的表格,其中包括first_name、middle_name和last_name三个独立列。在first_name = 'John',last_name = 'Doe',而middle_name为NULL的情况下,这意味着我们不知道中间名是什么,或者它是否存在。将该场景更改为middle_name = ''(即空字符串),现在意味着我们知道没有中间名。
我曾听说过一个SQL Server教练提倡使数据库中的每个字符类型列都是必需的,并分配每个列的默认值为''(空字符串)或'unknown'。通过这种说法,该教练表明他对NULL和空字符串之间的差异没有清晰的理解。不可否认,这些差异可能令人困惑,但对我来说,上面的例子有助于澄清差异。此外,在编写SQL代码时正确处理NULL和空字符串也很重要。
空字符串是长度为零或没有字符的字符串。
null
表示缺少数据。
NULL
、''
或 N''
中的一个)使用的磁盘空间较少或处理速度更快,而不会以其他方式损害我们的数据库设计,则可以节省大量运营费用。 - Dai所有列中的NULL
值都会被单独存储在特殊的位图空间中。
如果您的应用程序不区分NULL
和''
,那么我建议您在表中存储''
(除非字符串列是外键,在这种情况下,如果与应用程序逻辑兼容,则最好禁止该列存储空字符串并允许NULL
)。
如果不是外键字段,不使用空字符串可能会为你带来一些麻烦。只有当null代表的含义与空字符串不同才允许使用null。例如,如果您有一个密码字段,null值可以表示新用户尚未创建密码,而空varchar可以表示空密码。对于"地址2"这样的字段,允许null只会使事情变得更加困难。需要注意的事项包括Vagif Verdi提到的null引用和=以及<>操作符产生的意外结果,而关注这些事情通常是程序员不必要的开销。
编辑:如果性能是一个问题,请参考这个相关的问题:可为空与非空varchar数据类型-哪个查询速度更快?
NULL
是一个非值,就像未定义一样。 ''
是一个没有字符的空字符串。
数据库中字符串的值取决于您在 UI 中的值,但通常情况下,如果您在查询或存储过程中指定了参数,则为空字符串''
。
就判断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
现在毫无疑问。