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

Or *_*r A 4 sql sql-server string null

有一段时间我在讨论是否应该留下我不知道数据是否会被传入的列并将值设置为空字符串('')或仅允许空值.

我想听听这里的推荐做法.

如果它有所作为,我使用c#作为消费应用程序.

mjv*_*mjv 7

恐怕...

这取决于!

这个问题没有一个单一的答案.

如其他响应中所示,在SQL级别,NULL和空字符串具有非常不同的语义,前者表示该值是未知的,后者表示该值是这个"不可见的东西"(在显示和报告中),但然而,它是一个"已知价值".在此上下文中通常给出的示例是中间名称的示例."middle_name"列中的空值表示我们不知道底层人物是否具有中间名,如果是,该名称是什么,空字符串将表示我们"知道"此人没有有一个中间名.

这就是说,对于给定的列,另外两种因素可以帮助您在这些选项之间进行选择.

  • 底层数据的语义,在应用程序级别.
  • SQL使用空值的方式中的一些注意事项

数据语义
例如,了解空字符串是否为基础数据的有效值非常重要.如果是这种情况,如果我们也使用空字符串表示"未知信息",我们可能会丢失信息.另一个考虑因素是,当我们没有列的信息时,是否可以使用某些替代值; 也许'不适用'或'未指定'或'tbd'是更好的价值观.

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

除了选择NULL与空字符串的有效性之外,在给定的情况下,一般要考虑尝试并尽可能保持一致,即尝试坚持一种特定的方式,并且只是/故意/明确地脱离这一点在很少的情况下有充分理由的方式.