sql-server - Varchar 列 : Nullable or not

标签 sql-server null types nullable sqldatatypes

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

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

我相信空字符串和空值虽然在技术上不同,但在概念上是相同的。空的零长度字符串是不存在的字符串。它没有任何值(value)。但是,数值 0 与 NULL 不同。

例如,如果名为 OutstandingBalance 的字段的值为 0,则表示剩余 0.00 美元。但是,如果同一字段为 NULL,则表示该值未知。另一方面,值为“”的名为 CustomerName 的字段与值为 NULL 的情况基本相同,因为两者都表示该名称不存在。

我在某处读到,空字符串与 NULL 的类比就像空白 CD 与无 CD 的比较。然而,我认为这是一个错误的类比,因为空白 CD 在物理上仍然存在,并且仍然具有没有写入任何有意义的数据的物理数据空间。基本上,我相信空白 CD 相当于一串空格 (""),而不是空字符串。因此,我认为一串空格是与 NULL 分开的实际值,但空字符串在概念上相当于 NULL 等价的值的缺失。

请让我知道我对可变长度字符串的信念是否有效,如果无效,请启发我。我已经阅读了有关此主题的几篇博客/论点,但仍然没有看到 NULL 和空字符串之间真正的概念差异。

最佳答案

它几乎可以归结为这一点 - 在您的应用程序中,对于特定字符串,有空字符串和根本没有字符串之间有区别吗?

如果没有区别,那么您遵循的标准就可以。

如果您发现存在差异,则 null 具有独特的含义,应该被允许。

根据我的经验,null 通常被建模为表示未知

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

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

同样,如果您的应用程序对没有中间名的人和中间名未知的人一视同仁,那么对两者使用空字符串是有意义的(即使这确实意味着丢失一些信息)。

关于sql-server - Varchar 列 : Nullable or not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3000812/

相关文章:

mysql - 什么是聚簇索引表?

c# - 如何在写入表之前检查数据是否存在

java - 非空枚举像非空对象?

MySQL如何查找表中的空数据

C#:存储百分比,50 还是 0.50?

types - Julia:如何避免自动促销类型的变化?

sql - 根据连接的值将连接结果添加为新列

java - 如何在我自己的类中处理 null 以避免 NullPointerException

Java接口(interface)作为引用类型?

sql-server - 根据开始日期和结束日期创建唯一约束