2

应该将空字符串和 NULL 视为不同值的场景示例是什么?

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

4

3 回答 3

1

简而言之,这允许可选的唯一字段。

让我们以金融证券为例:有些是使用多个代码识别的。彭博代码、ISIN 代码、Sedol 代码、路透社代码……但很少有所有证券同时注册所有类型的代码。

但是,如果已经为一种证券分配了一种类型的代码,则您不希望另一种证券重用相同的值。

因此需要唯一性和可选性,混合 '' 和 NULL 可以防止,因为如果您尝试为未分配的代码插入 '' 两次,数据库会抱怨。

于 2013-06-19T08:06:48.423 回答
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 可以被认为是“无价值”的,其中空字符串可能是您的应用程序中完全有效的值。

于 2013-01-06T06:30:35.103 回答
0

在我看来,这两个值在语义上是不同的。空字符串是一个有效的字符串实例,而 null 表示该值根本没有设置(请注意,通常 null 不是仅为字符串类型保留的,而是适用于任何可空类型的一般概念,因此我不处理null 作为字符串值(即来自所有可能字符串值的集合中的值),而空字符串特定于字符串类型并且是字符串值 - 即它属于可能的字符串值集合)。要理解我的意思,请查看可空整数类型 - 0 和 null 之间有区别吗?显然有。string 和 int 示例之间的区别在于,在现实世界中 0 比空字符串更有用。在现实世界中,空字符串和 null 也经常是等价的。当您可能想要空字符串而不是 null 时,一种用例是您想要从字符串中删除所有出现的字符/子字符串。最简单的方法是将要删除的内容替换为空字符串。我不知道用空值替换子字符串意味着什么 - 根据您使用的语言,它的行为可能会有所不同。但是,如果我使用空字符串,无论语言如何,我都会期望相同的行为。

于 2013-01-06T07:17:42.843 回答