使用空字符串值与使用null值相比有什么好处?

5

我的问题是:

在我工作的地方,我需要对一个非常大的数据库运行报告。我使用基本的SQL查询和PHP来过滤我想要的内容。偶尔会出现一些不符合搜索条件的组。

我注意到所有出现在我的报告中的“散兵游勇”似乎都在某些字段上具有NULL值。

查看数据库结构,发现这些数据库中的NULL值都有一个NOT NULL标志。

事实证明,这些实际上不是NULL值,而是空字符串或$value=''。

在我的过去经验中,当我刚开始学习时,我经常犯这个错误,将某些东西设置为''而不是设置为NULL。

我问过DBA,是否有任何合法的理由可以解释为什么这样设置(有300,000多条记录是这样的),但他毫无头绪。

我认为这可能是另一个程序员的错误,或者是某人尝试避免由于特定字段上设置了“NOT NULL”标志而无法插入记录。

因此,我在这里苦苦思索,试图找到这些存在的合法理由,除了我自己怀疑的那个:该数据库没有为这两种类型的记录设计:具有此值的记录和不具有此值的记录。

你有什么想法吗?


那个字段的默认值是什么?如果它的默认值是 '' 空字符串,那么你的“坏”记录是由于插入操作没有为其指定一个值,而数据库管理系统只是给了它默认值。 - Marc B
很可能是由于HTML表单包含空字符串的原因。如果我在表单上留下一个空白字段,处理表单的代码可能不仅仅是不设置该值,而是将其设置为空字符串值。我不确定我是否完全理解空字符串会导致什么问题。为什么空字符串会导致搜索结果出现? - dqhendricks
4个回答

2

空字符串值和使用null值之间的好处并没有实质性的区别。问题在于当一个单独的列可以包含两者时,主要涉及排序和搜索:

排序

SELECT '' as c1
UNION 
SELECT NULL as c1
UNION
SELECT 'a' as c1
ORDER BY c1

您会发现NULL值将被列在首位,然后是字符串值(空字符串在前)。如果您正在进行多列ORDER BY操作,并且想知道为什么某些列总是在顶部,请记住这一点。

搜索

当一个列是NULL时,您需要使用IS NULLIS NOT NULL进行搜索,而不是使用= ''。此外,当您执行LENGTH(c1) = 0时,这些NULL记录将不会被包括在内,而空字符串则会被包括。
最后,在自连接中将列与自身进行比较时,您将无法进行简单的=操作。
总之,最好将列值统一为一种类型,并使您的SQL语句保持一致。

2

我经常看到这种情况,特别是在以下情况下:

  • 数据库被多个客户端(主要应用程序、临时查询、自动导入接口等)使用
  • 数据已从一个系统转换或迁移至另一个系统

现在可能没有正当理由,但在某个时候对某些人来说可能是个好主意。当你不知道数据库的历史时,很难知道结构决策背后的约束或理念。

我通常会非常小心处理空字符串和null值,因为我也曾遇到过相同的问题。通常有兼容性原因阻止更改数据库结构,因此只能使用像ISNULL(c1,'')COALESCE(c1,'')这样的解决方法来捕获null值和空字符串。


1

在数据库中使用NULL作为一个值并不被所有人认可,我想参考维基百科关于NULL的文章,以便了解NULL可能会在查询中引入的一些怪异之处的解释。

因此,也许数据库架构师并不是NULL的拥护者,也许是在阅读《第三宣言》后。 这份PDF文档(由《第三宣言》的作者之一撰写)可以帮助您理解问题,并向您展示如何处理缺失值的特殊情况。


非常有用的FVU,这正是我在寻找的! - Kevin Collins

0
在我看来,空字符串代表着缺失的值,而NULL则代表着未知的值
因此,在我看来,""NULL更具体。例如,如果一个人的出生地不知道,将其存储为NULL是可以的,但将其存储为""是不可以的。如果一个人没有中间名,并且已知该人没有中间名,则最好存储""而不是NULL
原因:NULL是指示所有数据类型中值未知的唯一方式。空字符串""更像整数的0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接