1

我读到 null 不能与 null 进行比较,结果总是错误的。

在下面的链接中,我可以比较 2 个空值并返回行。

CREATE TABLE user (id varchar(50), banstatus varchar(100));
INSERT INTO user (id, banstatus) VALUES ('1', '1');
INSERT INTO user values ('2', 'NULL');

CREATE TABLE banstatus (id varchar(50), texti varchar(100));
INSERT INTO banstatus VALUES('1', 'Banned');
Insert into banstatus values ('NULL' , 'NULL');

select * from user as u
join banstatus as b on u.banstatus=b.id

http://sqlfiddle.com/#!9/33f25/1/0

那么关于空值比较的正确说法是什么?

4

3 回答 3

3

您插入的值是字符串。'NULL'是一个字符串并且是一个确定的值。要插入NULL,您不应使用引号,例如:

INSERT INTO table (field1, field2) VALUES ('foo', NULL)

演示

而且您无法与 , 进行比较NULL,以了解其含义,它类似于未定义。虽然,您可以测试一个值是否为NULL

于 2017-10-12T19:11:47.547 回答
3

您正在使用 'NULL' (一个字符串)而不是 NULL .. 所以您正在比较两个(相同的)字符串

在 mysql 中有一个空安全运算符,将两个空值都比较为真

  <=>

NULL 安全相等。此运算符执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。

https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to

因此,对于正确的空安全连接,您应该使用

 select * from user as u
 join banstatus as b on u.banstatus<=>b.id
于 2017-10-12T19:13:37.133 回答
1

在您的回答中,您将 NULL 与 varchar 进行比较,而不是纯 NULL。

于 2017-10-12T19:12:29.683 回答