我们组织中的数据库开发标准声明varchar字段不应该允许空值.它们应该有一个空字符串(“”)的默认值.我知道这使得查询和连接更容易,但今天,我的一个同事质疑我为什么标准只存在于varchar类型,而不是其他数据类型(int,datetime等).我想知道其他人是否认为这是一个有效的防御标准,或者如果varchar应该被视为与其他数据类型的字段相同?
我认为这个标准是有效的,原因如下:
我相信一个空字符串和空值,虽然在技术上是不同的,在概念上是一样的.空的零长度字符串是不存在的字符串.它没有价值.但是,数值为0与NULL不同.
例如,如果一个名为OutstandingBalance的字段的值为0,则表示剩余$0.00.但是,如果相同的字段为NULL,则表示该值为未知.另一方面,名为CustomerName的值为“”的字段与NULL的值基本相同,因为它们都表示不存在该名称.
我读到某个空字符串与NULL的比喻是空白的CD而不是CD.但是,我认为这是一个错误的比喻,因为空白的CD仍然存在,并且仍然具有没有写入任何有意义的数据的物理数据空间.基本上,我相信一个空白的CD相当于一个空格(“”),而不是一个空字符串.因此,我相信一串空格是一个与NULL分开的实际值,但是一个空字符串作为概念上等价于NULL的值的空白字符串.
如果我对可变长度字符串的信念是有效的,请让我知道,或者如果不是,请告知我.我已经阅读了关于这个主题的几个博客/论点,但是在NULL和空字符串之间仍然没有看到真正的概念上的区别.
解决方法
这在很大程度上归结于这一点 – 在你的应用程序中,对于一个特定的字符串,有一个空字符串没有字符串的区别吗?
如果没有区别,那么你所遵循的标准是正确的.
如果发现有差异,那么null具有不同的含义,应该被允许.
根据我的经验,null通常被建模为意味着未知.
这是一个更具体的例子 – 中间人的名字:
>如果您知道中间名称,那么该值将被填充
>如果您知道该人没有中间名,则使用空字符串(”)
>如果你不知道一个人是否有一个中间名,一个null可能更合适
再次,如果你的应用程序对待没有中间名的人和那些不相同的人,那么对于两者都使用空字符串是有意义的(即使这意味着丢失一些信息).