SQL Server 2008 - 默认列值 - 我应该使用null还是空字符串?

4

最近我一直在思考一个问题,我不确定是否应该保留一些列,因为我不知道是否会传入数据,并将值设置为空字符串(''),还是只允许为空。

我希望听到这里的推荐做法。

如果有所区别的话,我使用的是C#作为消费应用程序。

5个回答

7

我很抱歉,这个问题没有一个单一的答案。

这要看情况!

正如其他回答所指出的那样,在SQL的级别上,NULL和空字符串具有非常不同的语义。前者表示该值未知,而后者表示该值是这个“不可见的东西”(在显示和报告中),但无论如何它都是一个“已知的值”。在这种情况下通常给出的例子是中间名。在“middle_name”列中的null值将表示我们不知道底层人员是否有中间名,如果有,这个名字是什么,而空字符串则表示我们“知道”这个人没有中间名。

不过,对于给定的列,还有两种因素可能会帮助您选择这些选项之间的区别。

  • 在应用程序级别下,底层数据的语义非常重要。
  • SQL处理null值的方式和一些考虑因素。

数据语义
例如,了解空字符串是否是底层数据的有效值非常重要。如果是这种情况,如果我们也使用空字符串来表示“未知信息”,那么我们可能会丢失信息。另一个考虑因素是在我们没有该列信息的情况下是否可以使用某些替代值。也许“n/a”、“unspecified”或“tbd”是更好的值。

SQL行为和实用程序
考虑到SQL的行为,使用或不使用NULL的选择可能受空间限制、创建过滤索引的愿望或COALESCE()函数的方便性驱动(可以用CASE语句模拟,但方式更冗长)。另一个考虑因素是任何查询是否会尝试查询多个列以追加它们(如SELECT name + ', ' + middle_name AS LongName等)。

除了在特定情况下选择NULL与空字符串之外,一个一般性的考虑是尽可能保持一致,即尽可能坚持一种特定的方法,并且只有在必要且少数情况下才明确地偏离这种方法。


3

如果没有值,请勿使用空字符串。如果您需要知道一个值是否未知,请设置标志。但是十次中有九次,如果未提供信息,则该信息是未知的,这很好。


3

NULL 表示未知值。空字符串表示已知值,即长度为零的字符串。这两者是完全不同的。


1

当我想要一个有效的默认值,可能会更改,例如用户的中间名时,使用空值。

如果随后的代码没有明确设置值,则使用NULL表示错误。

然而,通过使用空值来初始化字符串而不是null,可以减少发生NullReferenceException的机会。


1

抛开理论,我倾向于将:

  • 空字符串视为已知值
  • NULL 视为未知值

在这种情况下,我可能会使用 NULL。

一个重要的事情是要保持一致:混合使用 NULL 和空字符串会导致问题。

在实际实现层面上,SQL Server 中的空字符串占用 2 个字节,而 NULL 使用位图。在某些条件下,对于宽表或大表,在性能上会产生差异,因为需要转移更多的数据。


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