我在一个网站上有一个表格,里面有很多不同的领域。有些字段是可选的,有些是必选的。在我的DB中,我有一个表,其中包含所有这些值,是更好的实践插入一个NULL值或一个空字符串到用户没有放任何数据的DB列?
当前回答
要记住的一件事是,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
这会让事情变得更加复杂。
其他回答
通过使用NULL,你可以区分“不放数据”和“放空数据”。
还有一些不同之处:
NULL的LENGTH为NULL,空字符串的LENGTH为0。 null在空字符串之前排序。 COUNT(message)将计算空字符串,但不计算null 您可以使用绑定变量搜索空字符串,但不能搜索NULL。这个查询: SELECT * 从mytable WHERE mytext = ? 将永远不会匹配mytext中的NULL,无论你从客户端传递什么值。要匹配null,你必须使用其他查询: SELECT * 从mytable 哪里mytext是空的
如果你打算切换数据库,有一件事需要考虑,那就是Oracle不支持空字符串。它们会自动转换为NULL,你不能使用WHERE somefield = "这样的子句来查询它们。
我不知道这里的最佳实践是什么,但我通常倾向于使用null,除非您希望null表示与空字符串不同的东西,并且用户的输入与您的空字符串定义相匹配。
请注意,我是说您需要定义您希望它们如何不同。有时让它们不同有意义,有时没有意义。如果没有,那就选一个,然后坚持下去。就像我说的,大多数时候我倾向于使用NULL。
哦,请记住,如果列为空,那么实际上任何基于该列进行选择(在SQL术语中有where子句)的查询中都不太可能出现该记录,当然,除非选择为空列。
为了在MySQL数据库中保持一致性,最好插入NULL。外键可以存储为NULL,但不能存储为空字符串。
在约束条件中使用空字符串会有问题。 您可能必须插入一个具有唯一空字符串的假记录来满足外键约束。我想这是个坏习惯。
请参见:外键可以为NULL和/或复制吗?
要记住的一件事是,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
这会让事情变得更加复杂。
推荐文章
- PostgreSQL列名区分大小写吗?
- 在WHERE子句中引用列别名
- 在ROR迁移期间,将列类型从Date更改为DateTime
- 恢复未保存的SQL查询脚本
- 如何删除所有MySQL表从命令行没有DROP数据库权限?
- 从主机连接到docker容器中的mysql
- 如果任何字段包含NULL, MySQL CONCAT将返回NULL
- 向临时表中插入数据
- 无法绑定多部分标识符
- MySQL中的字符串连接
- 为什么Oracle 9i将空字符串视为NULL?
- Laravel未知列'updated_at'
- 导入CSV文件到SQL Server中
- NVL和Coalesce之间的Oracle差异
- 在SQL server查询中将NULL替换为0