我在网站上有一个表单,其中包含许多不同的字段。其中一些字段是可选的,而其他字段是强制性的。在我的数据库中,有一个表格保存了所有这些值,那么当用户没有输入任何数据时,将NULL值或空字符串插入到数据库列中哪个更好呢?
通过使用 NULL
,您可以区分“不放置数据”和“放置空数据”。
还有一些其他的差异:
NULL
的长度为 NULL
,空字符串的长度为 0
。
NULL
在空字符串之前排序。
COUNT(message)
会计算空字符串但不会计算 NULL
。
您可以使用绑定变量搜索空字符串,但不能搜索 NULL
。这个查询:
SELECT *
FROM mytable
WHERE mytext = ?
无论您从客户端传递什么值,都无法匹配mytext
中的NULL
。要匹配NULL
,您必须使用其他查询:
SELECT *
FROM mytable
WHERE mytext IS NULL
需要考虑的一件事是,如果你曾经打算更换数据库,那么 Oracle不支持空字符串。它们会自动转换为NULL,并且您无法使用诸如WHERE somefield = ''
这样的子句查询它们。
Steve B.
:请查看这个问题:https://dev59.com/nHM_5IYBdhLWcg3w6HzT - QuassnoiNULL
以保持一致性。外键可以存储为NULL
,但不能存储为空字符串。需要记住的一件事是,NULL可能会使您的代码路径变得更加困难。例如,在Python中,大多数数据库适配器/ORM将 NULL
映射为 None
。
因此,像这样的事情:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
可能会导致输出 "Hello, None Joe Doe!" 为了避免这种情况,您需要类似于以下代码:
if databaserow.title:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
print "Hello, %(firstname) %(lastname)!" % databaserow
这可能会使事情变得更加复杂。
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`event_title` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
`url` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
所以,这里没有对与错。由你决定哪种方式适合你的业务规则。