什么是空字符串和NULL应该区别对待的用例?

时间:2013-01-06 06:25:46

标签: django oracle null

什么是一个场景的例子,其中空字符串和NULL应该被视为不同的值?

(我问,因为Django和Oracle认为它们无法区分,但有些数据库将空字符串和NULL视为2个不同的值。)

3 个答案:

答案 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的一个用例。最简单的方法是用空字符串替换要删除的内容。我不知道用空值替换子字符串意味着什么 - 它可能会根据您使用的语言而有所不同。但是,如果我使用空字符串,无论语言如何,我都会期望相同的行为。