Varchar列:Nullable与否

DCN*_*YAM 11 sql-server null types nullable sqldatatypes

我们组织中的数据库开发标准声明varchar字段不应允许空值.它们的默认值应为空字符串("").我知道这使得查询和连接更容易,但今天,我的一位同事质疑我为什么该标准仅存在于varchar类型而不是其他数据类型(int,datetime等).我想知道其他人是否认为这是一个有效的,可辩护的标准,或者varchar是否应该被视为与其他数据类型的字段相同?

我相信这个标准是有效的,原因如下:

我认为空字符串和空值虽然技术上不同,但在概念上是相同的.空的零长度字符串是不存在的字符串.它没有任何价值.但是,数值0与NULL不同.

例如,如果名为OutstandingBalance的字段的值为0,则表示剩余的金额为0.00.但是,如果相同的字段为NULL,则表示该值未知.另一方面,名为CustomerName的值为""的字段与NULL值基本相同,因为两者都表示名称不存在.

我在某处读到空字符串与NULL的类比是空白CD与无CD的比较.不过,我相信这是一个错误的类比,因为一张空白CD仍然存在phyically,仍然有不具有写入任何有意义的数据物理数据空间.基本上,我相信一个空白的CD是空白(""),而不是一个空字符串的字符串的等价物.因此,笔者认为空格的字符串是从NULL单独的实际值,而是一个空字符串是有价值由于缺少概念上等同于NULL.

如果我对可变长度字符串的信念有效,请告诉我,如果不是,请告诉我.我已阅读关于这个问题的几个博客/参数,但仍然没有看到空值和空字符串之间的真正概念上的差异.

Ode*_*ded 17

它几乎归结为这个 - 在你的应用程序中,对于一个特定的字符串,有一个空字符串到没有字符串之间有区别吗?

如果没有区别,那么你所遵循的标准是好的.

如果您发现存在差异,则null具有明确的含义并且应该被允许.

根据我的经验,null通常建模意味着unknown.

这是一个更具体的例子 - 人的中间名:

  • 如果您知道中间名,则填充该值
  • 如果您知道此人没有中间名,那么请使用空字符串('')
  • 如果您不知道某人是否有中间名,则null可能更合适

同样,如果你的应用程序对待没有中间名的人以及那些未知的人,那么使用空字符串是有意义的(即使它确实意味着丢失一些信息).

  • +1:业务规则驱动列的可选性,而不是数据类型。此外,使用 NULL 与零长度字符串不会节省空间:http://vampirebasic.blogspot.com/2009/01/sql-server-null-varchar-vs-empty.html (2认同)