Answers:
通过使用,NULL
您可以区分“不输入数据”和“不输入数据”。
更多区别:
一个LENGTH
的NULL
就是NULL
,一个LENGTH
空字符串的是0
。
NULL
s在空字符串之前排序。
COUNT(message)
将计算空字符串,但不计算NULL
s
您可以使用绑定变量搜索空字符串,但不能搜索NULL
。该查询:
SELECT *
FROM mytable
WHERE mytext = ?
无论您从客户端传递的值如何,都永远不会匹配NULL
in mytext
。要匹配NULL
s,您必须使用其他查询:
SELECT *
FROM mytable
WHERE mytext IS NULL
如果您计划切换数据库,则要考虑的一件事是Oracle不支持空字符串。它们会自动转换为NULL,您不能使用诸如这样的子句查询它们WHERE somefield = ''
。
Steve B.
:看到这个问题:stackoverflow.com/questions/1171196/…–
要记住的一件事是,NULL可能会使您的代码路径困难得多。例如,在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
这会使事情变得更加复杂。
最好插入NULL
,以确保MySQL中数据库的一致性。外键可以存储NULL
为空字符串,但不能存储为空字符串。
约束中的空字符串会带来问题。您可能必须插入带有唯一空字符串的假记录,才能满足外键约束。我猜是不好的做法。
另请参阅:外键可以为NULL和/或重复吗?
如果在唯一索引中使用多个列,并且这些列中至少有一个是强制性的(即必填字段),则如果将索引中的其他列设置为NULL,则可能会出现重复的行。这是因为NULL值在唯一列中被忽略。在这种情况下,请在唯一索引的其他列中使用空字符串,以避免重复的行。
唯一索引中的列: (event_type_id,event_title,日期,位置,网址) 示例1: (1,'BBQ','2018-07-27',null,null) (1,'BBQ','2018-07-27',null,null)//允许并重复。 范例2: (1,'BBQ','2018-07-27',``,'') (1,'BBQ','2018-07-27',``,'')//不允许重复,因为
以下是一些代码:
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', '', '');
因此,这里没有对与错。由您决定哪种方法最适合您的业务规则。