rof*_*fle 224 mysql sql sql-null
我在一个有很多不同领域的网站上有一个表格.某些字段是可选字段,而某些字段是必填字段.在我的数据库中,我有一个包含所有这些值的表,是否更好的做法是将NULL值或空字符串插入到用户未放置任何数据的DB列中?
Qua*_*noi 216
通过使用,NULL
您可以区分"无数据"和"放空数据".
更多的差异:
一个LENGTH
的NULL
就是NULL
,一个LENGTH
空字符串的是0
.
NULL
s在空字符串之前排序.
COUNT(message)
将计算空字符串但不计算NULL
s
您可以使用绑定变量搜索空字符串,但不能搜索NULL
.这个查询:
SELECT *
FROM mytable
WHERE mytext = ?
Run Code Online (Sandbox Code Playgroud)
永远不会匹配NULL
in mytext
,无论你从客户端传递什么价值.要匹配NULL
s,您必须使用其他查询:
SELECT *
FROM mytable
WHERE mytext IS NULL
Run Code Online (Sandbox Code Playgroud)Mat*_*nit 42
有一点要考虑,如果你曾经在切换数据库计划,是Oracle不支持空字符串.它们会自动转换为NULL,您无法使用类似的子句查询它们WHERE somefield = ''
.
要记住的一件事是NULL可能会使您的代码路径变得更加困难.例如,在Python中,大多数数据库适配器/ ORM映射NULL
到None
.
所以像:
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
在MySQL中插入数据库以保持一致性.外键可以存储NULL
为空字符串,但不能存储为空字符串.
在约束中,您将遇到空字符串的问题.您可能必须插入具有唯一空字符串的伪记录以满足外键约束.我猜是不好的做法.
另请参阅:外键是否可以为NULL和/或重复?
我不知道这是什么最佳实践,但是我通常会偏向于null,除非您希望null表示不同于空字符串的内容,并且用户输入与您的空字符串定义匹配。
请注意,我是说您需要定义您希望它们与众不同的方式。有时候让它们有所不同是有意义的,有时候却没有。如果没有,请选择一个并坚持使用。就像我说的那样,大多数时候我倾向于使用NULL。
哦,请记住,如果该列为空,则该记录几乎不会出现在基于该列选择(在SQL术语中具有where子句)的任何查询中,除非该选择是针对空列的当然。