有一段时间我在讨论是否应该留下我不知道数据是否会传入的列并将值设置为空字符串('')或只允许空值。
我想听听这里的推荐做法。
如果它有所作为,我使用c#作为消费应用程序。
答案 0 :(得分:7)
我害怕...
这个问题没有一个答案。
如其他响应中所示,在SQL 级别, NULL和空字符串具有非常不同的语义,前者表示该值未知,后者表示这个值是“看不见的东西”(在显示和报告中),但不过是“已知值”。在此上下文中通常给出的示例是中间名称的示例。 “middle_name”列中的空值表示我们不知道底层人物是否具有中间名,如果是,该名称是什么,空字符串将表示我们“知道”此人所做的< em> not 有一个中间名。
这就是说,对于给定的列,另外两种因素可以帮助您在这些选项之间进行选择。
数据语义
例如,了解空字符串是否为基础数据的有效值非常重要。如果是这种情况,如果我们也使用空字符串表示“未知信息”,我们可能会丢失信息。另一个考虑因素是,当我们没有列的信息时,是否可以使用某个替代值;也许'不适用'或'未指定'或'tbd'是更好的价值观。
SQL行为和实用程序
考虑到SQL行为,使用或不使用NULL的选择可以通过空间考虑,创建过滤索引的愿望,或者通过COALESCE()函数(可以使用CASE语句模拟,但是以更冗长的方式)。另一个考虑因素是任何查询是否可能尝试查询多个列以附加它们(如SELECT name +','+ middle_name AS LongName等)。
除了选择NULL与空字符串的有效性之外,在给定的情况下,通常考虑尝试并尽可能保持一致,即尝试坚持一种特定的方式,并且只有/故意/明确地在很少的情况下出于正当理由离开这条路。
答案 1 :(得分:3)
如果没有值,请不要使用空字符串。如果您需要知道某个值是否未知,请为其指定一个标志。但是10次中有9次,如果没有提供信息,那就不知道了,那很好。
答案 2 :(得分:3)
NULL
表示未知价值。空字符串表示已知值 - 长度为零的字符串。这些是完全不同的东西。
答案 3 :(得分:1)
为空,例如,用户的中间名。
如果后续代码未明确设置值,则出现错误时为NULL。
但是,通过使用Empty值而不是null初始化字符串,可以减少发生NullReferenceException的可能性。
答案 4 :(得分:1)
在这种情况下,我可能会使用NULL。
一个重要的事情是保持一致:混合NULL和空字符串会以泪水结束。
在实际的实现级别上,空字符串在SQL Server中占用2个字节,其中NULL是位图。在某些情况下,对于宽/大表,它会产生不同的性能,因为它需要转移更多数据。