MySQL,最好插入NULL还是空字符串?

rof*_*fle 224 mysql sql sql-null

我在一个有很多不同领域的网站上有一个表格.某些字段是可选字段,而某些字段是必填字段.在我的数据库中,我有一个包含所有这些值的表,是否更好的做法是将NULL值或空字符串插入到用户未放置任何数据的DB列中?

Qua*_*noi 216

通过使用,NULL您可以区分"无数据"和"放空数据".

更多的差异:

  • 一个LENGTHNULL就是NULL,一个LENGTH空字符串的是0.

  • NULLs在空字符串之前排序.

  • COUNT(message)将计算空字符串但不计算NULLs

  • 您可以使用绑定变量搜索空字符串,但不能搜索NULL.这个查询:

    SELECT  *
    FROM    mytable 
    WHERE   mytext = ?
    
    Run Code Online (Sandbox Code Playgroud)

    永远不会匹配NULLin mytext,无论你从客户端传递什么价值.要匹配NULLs,您必须使用其他查询:

    SELECT  *
    FROM    mytable 
    WHERE   mytext IS NULL
    
    Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个好的答案,但它也完全忽略了问题的"最佳实践"元素,只关注切向相关的事实(NULL排序和长度?这些无关紧要).在大多数文本数据输入类型中,**不是"无响应"和"空响应"之间的区别,所以我认为这是一个值得更好答案的好问题. (35认同)
  • 在InnoDB中,NULL占用的空间更少 (8认同)
  • 设置UNIQUE字段时,NULL也很有效.例如,如果你有一个像驾驶执照这样的字段来添加人的DL编号而且那个人没有.由于它是一个独特的领域,第一个没有DL号的人会被添加而不是下一个,因为它会抛出一个唯一约束的错误.所以,NULL更好. (6认同)
  • 但你认为哪一个更快?0或NULL或"" (3认同)
  • @aadravid:没有区别. (3认同)

Mat*_*nit 42

有一点要考虑,如果你曾经在切换数据库计划,是Oracle不支持空字符串.它们会自动转换为NULL,您无法使用类似的子句查询它们WHERE somefield = ''.

  • 这对我来说听起来非常可疑,即使是在你的链接上,所以我试了一下.空字段,设置为'',oracle忽略它.报告长度为null而不是0.这是错误的.必须要有一些方法来解决这个问题.我想我会将此作为另一个问题发布. (11认同)
  • Peoplesoft(使用Oracle DB)使用单个空格来指示空值.令人难以置信的愚蠢.他们还使用0.00025来表示FTE为0,因为不允许0.在该产品中做出了可爱的选择. (7认同)

max*_*max 9

要记住的一件事是NULL可能会使您的代码路径变得更加困难.例如,在Python中,大多数数据库适配器/ ORM映射NULLNone.

所以像:

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
Run Code Online (Sandbox Code Playgroud)

可能导致"你好,没有Joe Doe!" 要避免它,你需要像这样的代码:

if databaserow.title:
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
    print "Hello, %(firstname) %(lastname)!" % databaserow
Run Code Online (Sandbox Code Playgroud)

这可能会使事情变得更加复杂.

  • 在我看来,滥用你的数据库"修复"你的代码或框架中的错误是一个(非常)糟糕的编码实践.当没有数据时,您应该只插入NULL并使用它一致.否则,您必须使用如下语句:if(myString == null || myString ="").当你的代码中没有设置或定义一个对象时,你也使用NULL而不是某种"占位符"(我认为这是一个空字符串). (25认同)
  • 很大程度上取决于您的选择语言.在Python"if not myString:"中测试None和"".可能主要是文化问题.Java Guys的"坏习惯"是充满活力的人的优雅. (5认同)

mic*_*all 9

最好NULL在MySQL中插入数据库以保持一致性.外键可以存储NULL为空字符串,但不能存储为空字符串.

在约束中,您将遇到空字符串的问题.您可能必须插入具有唯一空字符串的伪记录以满足外键约束.我猜是不好的做法.

另请参阅:外键是否可以为NULL和/或重复?


Pla*_*ure 5

我不知道这是什么最佳实践,但是我通常会偏向于null,除非您希望null表示不同于空字符串的内容,并且用户输入与您的空字符串定义匹配。

请注意,我是说您需要定义您希望它们与众不同的方式。有时候让它们有所不同是有意义的,有时候却没有。如果没有,请选择一个并坚持使用。就像我说的那样,大多数时候我倾向于使用NULL。

哦,请记住,如果该列为空,则该记录几乎不会出现在基于该列选择(在SQL术语中具有where子句)的任何查询中,除非该选择是针对空列的当然。