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

时间:2009-01-23 22:08:05

标签: .net sql-server

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

6 个答案:

答案 0 :(得分:6)

我不同意使用默认值。 null的目的是显示您没有信息。空字符串不代表,它是一个值。此外,如果您开始禁止字符串上的空值,则需要考虑其他数据类型。数字和日期很难有一个值,意思是“我没有这个字段的值。”如果你错误地在varchar字段中存储数字或日期,那么放置一个空字符串而不是null可能会导致查询无法在需要将它们转换为日期或数字等效时对其进行数学处理(不建议将日期和数字数据存储为字符串,只是认识到你可能已经有了一些,这个方案可能会导致它们被查询的问题。)如果除了这些字段之外你不允许所有的空值,你会犯很多很多错误查询这些字段因为你不会习惯于检查空值,并且更有可能忘记这样做。您也可以引发新的查询问题。考虑:

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

如果您在不知道值时使用null或空字符串来存储值,则会产生不同的结果。

答案 1 :(得分:5)

数据库中NULL的含义应保留为'unknown',这与empty不同。因此,只要您使用的默认值反映了基础数据的性质(即它不是'未知'),我实际上会建议使用默认值。

但是,您的里程可能会有所不同。这取决于您的应用程序。如果它以不同的方式处理未知值,那么请务必使用:)

答案 2 :(得分:2)

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

字符串很简单,但整数不同。考虑薪水栏。默认值为0,这可能表示与NULL不同。 NULL表示员工未通过工资核算,而0表示必须仍因某种原因处理该员工。

NULL也可以在外键上使用,但在FK上使用默认值似乎是个坏主意。

答案 3 :(得分:0)

我认为这取决于偏好和数据库目的,而我并不熟悉SQL服务器数据库如何存储数据,我猜测它会产生最小的实际差异,就像我一样使用Null条目和默认字符串作为区分方法,并且从未注意到任何方式的差异。

答案 4 :(得分:0)

向列添加空值会增加更多存储开销。为每八个可空列创建一个空位图。例如,一到八个可以为空的列为行添加一个额外的字节,九到十六添加另一个字节,每行总共增加两个字节,依此类推。

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

此外,将NULL与其他数据连接或聚合将导致重大问题,因为与NULL连接的任何内容都将导致NULL。聚合将忽略NULL并发出警告,但这可能不是您想要的平均行为。

我的建议是坚持使用非空列并使用空字符串作为占位符,如果你想尽可能地减少存储空间并且你不希望在代码中检查NULL的麻烦。我并不是说这适用于所有情况,并且可以为可空性做出论证,但这种方法使其变得简单。

答案 5 :(得分:0)

由您来决定,主要是由应用程序行为和业务需求驱动。

默认列,大部分时间用于

  1. 您的应用程序根本不想输入列。一个很好的例子是“审计”列,你不希望应用程序/用户在插入/更新行时进行提交
  2. 用于某些模块(网页/风表等)。例如,快速注册表单只接受所需的用户ID /名称,电子邮件和密码。
  3. 如果您不是懒于手动填写测试数据。我发现开发人员的懒惰主要是为了不必要地使用DEFAULT列。