MySQL - 关于null的=""和!=""的不同行为

Daa*_*aan 6 mysql sql string null

这可能是一个愚蠢的问题,但null似乎既不等于也不等于任何空字符串"".

我有一个包含以下值的表:

id field1 field2 field3
1   a        b     c
2   null     b     c
3            b     c
4   a        b     c
Run Code Online (Sandbox Code Playgroud)

我的查询

select * from table where field1 = ""
Run Code Online (Sandbox Code Playgroud)

不返回第2行,其中field1的值为null.这绝对有意义,因为null不等于空字符串.

但,

select * from table where field1 != "" 
Run Code Online (Sandbox Code Playgroud)

也不会返回第2行.

有没有人对此的历史渊源有解释?是因为值null意味着我们不知道该值,因此不知道field1是否等于或不等于第2行的空字符串?

Joh*_*nde 7

NULL不等于空.NULL不等于任何东西,包括NULL.要比较NULL你需要使用IS NULLIS NOT NULL

SELECT NULL = NULL,
NULL != NULL,
NULL IS NULL,
NULL IS NOT NULL

NULL = NULL     NULL != NULL        NULL IS NULL    NULL IS NOT NULL
(null)             (null)            1                  0
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

select * from table where field1 IS NULL
Run Code Online (Sandbox Code Playgroud)

要么

select * from table where field1 IS NOT NULL
Run Code Online (Sandbox Code Playgroud)


Mar*_*ams 3

是否因为值 null 意味着我们不知道该值,因此不知道 field1 是否等于或不等于第 2 行的空字符串?

你是对的。每当您进行比较时NULL,结果都是NULL

您可以将其视为NULL“未知”的意思。当NULL记录存储在列中时,并不意味着它没有值,而是意味着它尚未输入数据库中。

例如,您可能有一个“人员”记录,其中包含“出生日期”列。如果值为NULL,并不意味着该人没有出生。这只是意味着尚未输入,因此,根据数据库,该人的出生日期是“未知”。

如果您不知道此人的出生日期,则无法回答以下任一问题:

这个人是4月1日出生的吗?

这个人不是4月1日出生的吗?

两者的答案都是“未知”。

你也无法回答:

这个人是4月1日之后出生的吗?

这个人不是4月1日之前出生的吗?

每当您将已知值与“未知”进行比较时,答案将是“未知”。

此外,如果两个人的出生日期均为NULL或“未知”,您也无法回答以下问题:

两个人是同一天出生的吗?

两个人不是同一天出生的吗?

第一个人是在第二个人之后出生的吗?

第二个人是在第一个人之后出生的吗?

每当您将一个“未知”值与另一个“未知”值进行比较时,答案都是“未知”。

将任何内容与“未知”值进行比较都会产生“未知”。

但是,您始终可以回答以下问题:

我知道此人的出生日期吗?

我不知道这个人的出生日期吗?

要在 MySQL 中提出这个问题,您可以使用IS NOT NULLIS NULL