为什么 MySQL 在查找不相等时忽略空值?

Jay*_*len 5 mysql null

我注意到 MySQL 中有一些奇怪的东西,我想知道它为什么会这样,以及有什么方法可以改变它?

设想

我有帐户 InnoDB 表,id, name, type其中包含类型为可为空的以下列。

现在,假设我有 10 条记录,其中 type = "TEST" 和 100 条记录,type IS NULL以及 20 条记录,其中 type = "STANDARD"

如果我运行这个查询

SELECT * FROM accounts WHERE type <> "TEST"
Run Code Online (Sandbox Code Playgroud)

此查询将仅向我显示 type = "STANDARD" 的 20 条记录,并忽略具有空值的 100 条记录。

要解决这个问题,我将不得不做这样的事情

SELECT * FROM accounts WHERE IFNULL(type,"") <> "TEST"
Run Code Online (Sandbox Code Playgroud)

或者

SELECT * FROM accounts WHERE (type <> "TEST" OR type IS NULL)
Run Code Online (Sandbox Code Playgroud)

NULL 值表示空白“又名无值”,无值表示 <>“TEST”

这可能是预期的行为,但我不确定为什么会这样设计

Ven*_*hna 4

SELECT * FROM accounts WHERE type <> "TEST"
Run Code Online (Sandbox Code Playgroud)

该声明的含义是,

“选择accounts列值type不等于‘TEST’的行”。

type这意味着 MySQL 返回值不等于“TEST”的记录。

现在在这里,因为NULL意味着没有值,所以它不会返回那些没有任何type列值的记录。