MySQL,更好地插入NULL或空string?
我有一个网站上有很多不同领域的表格。 一些字段是可选的,而一些是强制性的。 在我的数据库中,我有一个表中包含所有这些值,是最好的做法插入一个NULL值或一个空string到用户没有放置任何数据的数据库列?
通过使用NULL
你可以区分“不input数据”和“input空数据”。
还有一些不同:
-
NULL
的LENGTH
为NULL
,空string的LENGTH
为0
。 -
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格式,这个问题可以被缓解。
但是,是的, 让零存在是十亿美元的错误 。