这是我的问题:
在我工作的地方,我需要在一个非常大的数据库上运行报告。我在PHP中使用基本的SQL查询来过滤我想要的内容。我经常会在报告中看到不符合搜索条件标准的群组。
我注意到,我的报告中出现的所有“落后者”在某些字段中似乎都是NULL值。
查看数据库结构,我发现数据库中的这些NULL值都设置了NOT NULL标志。
事实证明,这些实际上不是NULL值,而是空字符串值或$ value =''
在我过去的经历中,当我开始时,我会犯这个错误,设置一些东西=''而不是让它为空。
我问DBA他是否可以想出为什么这样设置的合理原因(有300,000个奇怪的记录是这样的)并且他没有任何线索。
我认为可能是另一个程序员错误或有人试图避免由于在该特定字段上设置的“NOT NULL”标志而无法插入记录。
所以我在这里试图寻找存在这些存在的正当理由,除了我自己怀疑数据库不是为这两种类型的记录而设计的:具有此值的记录和没有此值的记录
你有什么想法?
答案 0 :(得分:2)
空字符串值与使用空值
相比有什么好处
使用其中一个或者其他,没有任何实际问题。当单个列可以包含任何一个时出现问题,主要是排序和搜索:
SELECT '' as c1
UNION
SELECT NULL as c1
UNION
SELECT 'a' as c1
ORDER BY c1
您将看到首先列出NULL
,然后列出字符串值(先清空)。如果您正在进行多列ORDER BY
,并且您想知道为什么有些列始终位于最前面,请注意这一点。
当列NULL
时,您需要按IS NULL
或IS 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)
因此,您开始工作时甚至没有检查数据库,并在查询中设置错误的条件时遇到问题。
现在你正在寻找责怪的人 很聪明。
但是,你的问题不是那么聪明 因为在不知道表结构的情况下无法判断空字符串的好坏,报告详细信息等。