空字符串值与使用空值的好处是什么

时间:2011-09-09 17:28:43

标签: php sql-server-2005 coding-style

这是我的问题:

在我工作的地方,我需要在一个非常大的数据库上运行报告。我在PHP中使用基本的SQL查询来过滤我想要的内容。我经常会在报告中看到不符合搜索条件标准的群组。

我注意到,我的报告中出现的所有“落后者”在某些字段中似乎都是NULL值。

查看数据库结构,我发现数据库中的这些NULL值都设置了NOT NULL标志。

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

在我过去的经历中,当我开始时,我会犯这个错误,设置一些东西=''而不是让它为空。

我问DBA他是否可以想出为什么这样设置的合理原因(有300,000个奇怪的记录是这样的)并且他没有任何线索。

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

所以我在这里试图寻找存在这些存在的正当理由,除了我自己怀疑数据库不是为这两种类型的记录而设计的:具有此值的记录和没有此值的记录

你有什么想法?

5 个答案:

答案 0 :(得分:2)

  

空字符串值与使用空值

相比有什么好处

使用其中一个或者其他,没有任何实际问题。当单个列可以包含任何一个时出现问题,主要是排序和搜索:

排序

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保持一致。

答案 1 :(得分:2)

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

  • 各种客户端(主要应用程序,即席查询,自动导入界面......)触及了数据库。
  • 数据已从一个系统转换或迁移到另一个系统

现在可能没有合理的理由,但当时对其他人来说似乎是个好主意。当您不了解数据库的历史时,很难知道结构决策背后的约束或哲学。

我倾向于非常小心空字符串和空值,因为我被同样的问题所困扰。通常存在兼容性原因导致无法更改数据库结构,因此您需要使用ISNULL(c1,'')COALESCE(c1,'')来捕获空值和空字符串等变通方法。

答案 2 :(得分:1)

在数据库中使用NULL作为一个值有其批评者,我想引用Wikipedia article on NULL来解释一些NULL可能会在你的查询中引入的奇怪之处。

因此,数据库架构师可能不是NULL的粉丝,也许是在阅读“第三宣言”之后。 This PDF(由第三宣言的作者之一)可以帮助您理解问题,并向您展示如何管理丢失值的特殊情况。

答案 3 :(得分:0)

在我看来,空字符串表示缺少值,而NULL表示未知值

因此,在我看来,""NULL更具体。例如,如果一个人的出生地不知道,可以将其存储为NULL,但不能将其存储为""。如果一个人没有任何中间名,并且知道该人没有,那么最好存储""而不是NULL

原因:NULL是指示不知道某个值适用于所有数据类型的唯一方法。对于整数,空字符串""更像0

答案 4 :(得分:-1)

因此,您开始工作时甚至没有检查数据库,并在查询中设置错误的条件时遇到问题。

现在你正在寻找责怪的人 很聪明。

但是,你的问题不是那么聪明 因为在不知道表结构的情况下无法判断空字符串的好坏,报告详细信息等。