SQL Server数据库中的NULL与默认值

6

在向数据库插入行时,使用默认值(如空字符串)是否会有任何影响?使用null的问题在于在应用程序中使用数据时必须进行检查,而默认值可以更容易地处理。

6个回答

7

在数据库中,NULL的含义应该保留为“未知”,而不是空。因此,只要您使用的默认值反映了基础数据的性质(即它不是“未知”),我实际上建议使用默认值。

然而,这也取决于您的应用程序。如果它以不同的方式处理未知值,那么请按照该方式操作 :)


4
我不同意。NULL列意味着没有数据。没有数据意味着“空”。空字符串表示零长度的字符串,而不是“空”。对于数值列,你会使用什么特殊值?零?零不是“空”,它是零。 - Robert C. Barth
1
未知值[即NULL]是那些未被提供的值。这与空有何不同?这是一个语义游戏。 - Robert C. Barth
4
@Robert C. Barth:我不知道你在说什么,所以这里有一张兔子头上戴着煎饼的图片。http://www.faithmouse.com/oolong_pancake_bunny.jpg - Andrew Rollings

7

我不同意使用默认值。null的目的是显示您没有信息。空字符串并不意味着这一点,它是一个值。此外,如果您开始禁止字符串中的null,则需要考虑其他数据类型。数字和日期很难具有表示“我没有此字段的值”的值。如果您错误地将数字或日期存储在varchar字段中,那么在需要将它们转换为日期或数字等效项以执行数学处理时,用空字符串而不是null可能导致查询不起作用(不建议将日期和数字数据存储为字符串,只是认识到您可能已经拥有一些,并且这种方案可能会导致查询它们时出现问题)。如果除了这些字段之外,您不允许使用null,则在查询这些字段时会犯很多错误,因为您不习惯检查null,并且更容易忘记这样做。您还可以导致新的查询问题。请考虑:

select count(myfield), myfield2 from mytable group by myfield2

如果你不知道某个值,使用null或空字符串来存储会产生不同的结果。


2

我相信你会遇到的主要错误是逻辑错误。

字符串很容易处理,但整数不同。考虑一个工资列,如果默认值为0,则可能表示与NULL有所不同。NULL意味着员工未经过薪资支付,而0表示他仍需出于某种原因进行处理。

在外键上也可以使用NULL,但在FK上设置默认值似乎不是一个好主意。


默认情况下,外键的设置取决于数据库最初的设置。我曾经在一个销售系统上工作过,如果没有明确指定账户代表,那么潜在客户将被分配到公司账户。我们首先在账户代表表中创建了公司账户,然后使用该记录的ID作为外键的默认值。效果很好。 - eksortso

0

我相信这是一种偏好和数据库用途的问题,虽然我不是很熟悉 SQL Server 数据库存储数据的方式,但我认为这将会产生很少实际差异。因为我曾经使用过 Null 条目和默认字符串作为区分的方法,并没有发现太大的差异。


0

将 nullability 添加到列确实会增加更多的存储开销。每八个可空列都会创建一个 null 位图。例如,从第一个到第八个可空列会为行添加一个额外的字节,从第九个到第十六个则会再添加一个字节,以此类推,每行总共会增加两个额外的字节。

检查 NULL 和空字符串('')是不同的,因为您需要检查 COLUMN IS NULL OR COLUMN = ''。即使 COLUMN 是 NULL,COLUMN = NULL 的比较也不起作用,因为 NULL 不等于 NULL,因此需要使用 IS NULL 运算符。

此外,将 NULL 与其他数据连接或聚合会导致严重问题,因为任何与 NULL 连接的内容都将导致 NULL。聚合将忽略 NULL 并发出警告,但这可能不是您希望在平均值中看到的行为。

我的建议是坚持使用非空列,并在需要最小化存储并且不想在代码中检查 NULL 的情况下使用空字符串作为占位符。我并不是说这适用于每种情况,可以为 nullability 提出论点,但这种方法保持简单。


0

决定权在你手中,大多数情况下,这取决于应用程序行为和业务需求。

默认列通常在以下情况下使用:

  1. 您的应用程序根本不想输入该列。一个很好的例子是"审计"列,在插入/更新行时不需要应用程序/用户输入
  2. 用于某些模块(网页/窗体等)。例如,快速注册表单仅接受所需的用户ID /名称、电子邮件和密码。
  3. 如果您不懒得手动填写测试数据。我发现开发人员的懒惰主要驱使他们不必要地拥有默认列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接