MySQL,更好地插入NULL或空string?

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

通过使用NULL你可以区分“不input数据”和“input空数据”。

还有一些不同:

  • NULLLENGTHNULL ,空string的LENGTH0

  • NULL在空string之前被sorting。

  • COUNT(message)将计数空string,但不是NULL

  • 您可以使用绑定variablessearch空string,但不能为NULL 。 这个查询:

     SELECT * FROM mytable WHERE mytext = ? 

    将永远不会匹配mytext中的NULL ,无论您从客户端传递什么值。 要匹配NULL ,你必须使用其他查询:

     SELECT * FROM mytable WHERE mytext IS NULL 

有一点需要考虑,如果您计划切换数据库,则Oracle不支持空string 。 它们被自动转换为NULL,你不能使用像WHERE somefield = ''这样的WHERE somefield = ''来查询它们。

有一件事要记住,NULL可能会使你的代码path更加困难。 在Python中,大多数数据库适配器/ ORM都将NULL映射到None

所以这样的事情:

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

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

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

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

为了在MySQL中的数据库中保持一致性,最好插入NULL 。 外键可以存储为NULL而不是空string。

在约束中你将遇到空string的问题。 您可能必须插入一个具有唯一空string的假logging以满足外键约束。 不好的做法,我猜。

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

我不知道在这里最好的做法是什么,但是我通常会倾向于null,除非你希望null表示与空string不同的东西,并且用户的input符合你的空string定义。

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

哦,并且记住,如果列是空的,那么logging不太可能出现在几乎任何基于该列的select(具有where子句,以SQL术语)的查询中,除非该select是针对空列的当然。

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

something = abcdsomething if exist?(a) && exist?(ab) && exist?(abc) && exist?(abcd) && exist?(abcdsomething)something = abcdsomething if exist?(a) && exist?(ab) && exist?(abc) && exist?(abcd) && exist?(abcdsomething) ,那么强制您编写运行时types检查。

如果你不使用json / hash / array格式,这个问题可以被缓解。

但是,是的, 让零存在是十亿美元的错误 。