什么是一个场景的例子,其中空字符串和NULL应该被视为不同的值?
(我问,因为Django和Oracle认为它们无法区分,但有些数据库将空字符串和NULL视为2个不同的值。)
答案 0 :(得分:1)
简而言之,它允许使用可选的唯一字段。
我们以金融证券为例:一些是使用多个代码识别的。彭博代码,ISIN代码,Sedol代码,路透社代码......但很少所有证券都同时注册所有类型的代码。
但是,如果已经为一个安全性分配了一种类型的代码,则不希望其他安全性重用相同的值。
因此需要同时性和可选性,混合''和NULL可以防止,因为如果你试图为未分配的代码插入''两次,db就会抱怨。
答案 1 :(得分:0)
您可以拥有一个表示继承层次结构的数据库表(在.NET的实体框架中称为Table-Per-Hierarchy)。这意味着单个表存储该层次结构中所有派生类型的状态,以及基类。
看看这个类层次结构:
public class Animal
{
int Id,
int NumberOfLegs
}
public class Cat : Animal
{
string FurColor;
}
基类Animal没有字符串属性。但是,名为Cat的派生类型具有名为FurColor的字符串属性。如果我们使用Table-Per-Hierarchy,那么我们将使用列:
ID | NumberOfLegs | FurColor
我们可能还会有一个所谓的鉴别器列,它可以帮助区分不同的类型,但这在这里并不重要。
现在,如果你有一个Animal
基类的实例,那么你的对象只有2个属性。当此对象存储到数据库表中时,FurColor
没有值,因为该属性与Animal
类无关。因此NULL
是最合适的值,因为它表示此属性没有明确的值。另一方面,空字符串可以被认为具有某种含义,这在Animal
对象的结构上是不正确的,因为该属性在其上是不存在的。
如果您有Cat
类的实例,那么您的对象将具有3个属性。将其保存到数据库表在概念上需要所有3个字段。如果FurColor
没有特定值,则空字符串完全有效,在我看来,这是一个比NULL
更好的选项。这是因为当您从数据库中读取对象时,在将字符串连接等操作中使用它之前,您不必专门检查NULL
的属性(这将在NULL引用的行中引发某些内容)大多数静态类型语言中的例外,例如C#)。
长话短说,NULL可以被认为是'无价值',其中空字符串可能是您应用程序中完全有效的值。
答案 2 :(得分:0)
在我看来,这两个值在语义上是不同的。空字符串是一个有效的字符串实例,而null意味着该值根本没有设置(请注意,通常null不仅仅为字符串类型保留,但是是适用于任何可空类型的一般概念,因此我不会对待null作为字符串值(即来自所有可能字符串值的集合的值),而空字符串特定于字符串类型并且是字符串值 - 即它属于可能的字符串值集合)。要理解我的意思,看看可空整数类型 - 0和null之间有区别吗?显然有。 string和int示例之间的区别在于,在现实世界中,0比空字符串更有用。在现实世界中,空字符串和null也经常是等价物。 当您想要从字符串中删除所有出现的字符/子字符串时,可能需要空字符串而不是null的一个用例。最简单的方法是用空字符串替换要删除的内容。我不知道用空值替换子字符串意味着什么 - 它可能会根据您使用的语言而有所不同。但是,如果我使用空字符串,无论语言如何,我都会期望相同的行为。