2009-08-12 67 views
202

我在网站上有一个窗体,有很多不同的领域。一些字段是可选的,而一些是强制性的。在我的数据库中,我有一个包含所有这些值的表,在用户没有放入任何数据的数据库列中插入NULL值或空字符串是否更好?MySQL,最好插入NULL或空字符串?

回答

203

通过使用NULL,您可以区分“放入数据”和“放入空数据”。

一些更差异:

  • NULLLENGTHNULL,空字符串的LENGTH0

  • NULL s在空串之前被排序。

  • COUNT(message)将计空字符串,但不NULL小号

  • 您可以搜索使用绑定变量一个空字符串而不是为NULL。这个查询:

    SELECT * 
    FROM mytable 
    WHERE mytext = ? 
    

    不会匹配NULLmytext,你从客户端传递的任何值。为了匹配NULL S,你将不得不使用其他查询:

    SELECT * 
    FROM mytable 
    WHERE mytext IS NULL 
    
+1

但你认为哪一个更快? 0或NULL或“” – 2010-10-16 23:48:30

+3

@aadravid:没有区别。 – Quassnoi 2010-10-17 10:20:55

+7

in InnoDB NULL的占用空间较小 – 2013-07-25 10:41:45

3

我不知道什么最好的做法是在这里,但除非你想空我一般会倾向于空的犯错表示与空字符串不同的东西,并且用户的输入与您的空字符串定义相匹配。

请注意,我在说你需要定义你希望他们有什么不同。有时让它们有所不同有时是有道理的,有时它不是。如果不是,只需选择一个并坚持下去。就像我说的,我倾向于在大多数时候倾向于NULL。

哦,并且记住,如果该列为空,则该记录不太可能出现在几乎任何基于该列的选择(具有where子句,以SQL术语来说)的查询中,除非该选择是当然是一个空列。

+0

......现在我看到了上面的答案,我认为可以肯定地说,你关心的通常的区别是没有数据和空数据。 :-) – 2009-08-12 18:54:13

38

有一件事要考虑,如果你有有史以来计划切换数据库,是Oracle does not support empty strings。它们被自动转换为NULL,并且不能使用像WHERE somefield = ''这样的子句来查询它们。

+11

这听起来令人难以置信的腥,即使在你的链接,所以我试了一下。空字段设置为'',oracle忽略它。报告长度为空而不是0.这是错误的。这需要解决一些问题。想想我会发布这是另一个问题。 – 2009-08-12 19:10:44

+1

'史蒂夫B.':看到这个问题:http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi 2009-08-12 19:16:37

+0

感谢您的参考,但我仍然不明白的推理。 发表为http://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings – 2009-08-12 19:24:03

7

有一点要记住,NULL可能会让你的代码路径变得更加困难。例如在Python中,大多数数据库适配器/ ORM将NULL映射到None

所以像: “你好,无乔·多伊”

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 

可能导致为了避免它,你需要像这样的代码:

if databaserow.title: 
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 
else: 
    print "Hello, %(firstname) %(lastname)!" % databaserow 

这可以使事情变得更加复杂。

+22

在我看来滥用你的数据库来“修复”你的代码或框架中的错误是一个(非常)不好的编码习惯。当没有数据时,你应该插入NULL并且在使用时保持一致。否则,您必须使用如下语句:if(myString == null || myString =“”)。当你的代码中没有设置或定义一个对象时,你也使用了NULL而不是某种“占位符”(在我看来这是一个空字符串)。 – Gertjan 2009-08-12 19:39:16

+5

非常依赖您选择的语言。在Python中“如果不是myString:”测试None和“”。可能主要是文化问题。爪哇人的“坏习惯”是充满活力的人的优雅。 – max 2010-10-21 08:54:30

5

更好地插入NULL在MySQL中的数据库中的一致性。外键可以存储为NULL,但不能为空字符串。

在约束中,您将遇到空字符串的问题。 您可能必须插入带有唯一空字符串的假记录以满足外键约束。糟糕的做法,我猜。

参见:Can a foreign key be NULL and/or duplicate?

-1

我不知道性能做。但就数据质量而言,null是不好的。

Null为您提供类型maybe,这会迫使您编写运行时类型检查,例如: something = a.b.c.d.something if exist?(a) && exist?(a.b) && exist?(a.b.c) && exist?(a.b.c.d) && exist?(a.b.c.d.something)

如果您不使用json/hash/array格式,则可以减轻此问题。

但是,是的,letting null exist is a billion dollar mistake