我在一个数据库的很多字段上都看到了这个问题来自我一直在研究的项目,其中一个列将被定义为非null,但是默认情况下会有一个空字符串。这样做有什么意义?如果您允许空字符串,为什么不允许字段为空?
答案 0 :(得分:36)
NULL具有特殊行为:将任何内容与NULL进行比较会返回NULL
,这不是false
或0
。这意味着“未知”。
例如,请选择此表:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
将按预期返回1行
SELECT * FROM mytable WHERE gender != 'M'
将返回2行,而不是3行。
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
将返回预期的3行。
编辑:对于某些应用程序,使用0
(或者,上帝禁止,另一个“幻数”)而不是NULL
甚至不可取(单位或精确值在此示例中不相关) :
Date | Temperature
--------------------------
2010-01-01 | 10
2010-01-02 | 4
2010-01-03 | 0
2010-01-04 | -22
2010-01-05 | -45
2010-01-06 | NULL
2010-01-07 | -34
这里,1月6日的NULL
意味着“价值未知” - 可能因为温度太低而温度计探头停止响应。然而,它与1月3日完全不同,当时温度为0
,即0度。
另外,正如@Bill Karwin所提到的,NULL在聚合函数中特别表现(COUNT
,SUM
,AVG
等等:在上面的数据上计算AVG(Temperature)
会给你-14.5
,因为NULL行被忽略。
答案 1 :(得分:11)
null和“”不是一回事,所以这里没有矛盾。
null /“”的语义含义取决于个人,通常是一个“宗教”问题。对某些模式中的某些人来说,当然,它们可能是相同的,但它们并非必须如此。例如,“”可能表示“我明确要求用户输入,他们选择不输入任何内容”,而null可能意味着“我从未要求输入”。
答案 2 :(得分:4)
null值和空字符串之间存在差异 - 至少在SQL中。
SELECT LENGTH('tata');
4
SELECT LENGTH(NULL);
NULL
SELECT LENGTH('tata')-LENGTH('');
4
SELECT LENGTH('tata')-LENGTH(NULL);
NULL
答案 3 :(得分:1)
与数据库交互的大多数编程语言本身不支持NULL,它在数据库中的工作方式。例如,在C#中,null<> DbNull.Value。在VB中,大多数数据类型无法处理空语义,例如你不能在Date或Int等中存储null。通过减少客户端程序看到的空值数量,可以减少头痛。在VB的情况下,对于字符串意味着null的关闭事物是Empty,这更接近于未初始化,与“未知”
意义上的NULL意义不同。答案 4 :(得分:0)
因为有时候,在某些语言中,“选择”查询会为您提供字符串 NULL ,您必须检查它是否是包含内容的真实字符串“ NULL“或它实际上是空的。
用“”这是最简单的(恕我直言)
答案 5 :(得分:0)
我们不允许空值,因为以编程方式从具有DBnull值的数据表访问字段会导致异常,而空字符串具有值,因此不会出错。
答案 6 :(得分:0)
除了@Piskvor所提到的,这种做法也是存在的,以便在从DB读取后填充bean /对象等时在应用程序逻辑中防止一些潜在的NullPointerExceptions