Mysql WHERE子句中的NULL和空列选择失败

Mysql WHERE子句中的NULL和空列选择失败,mysql,sql,database,Mysql,Sql,Database,有人能告诉我为什么只有第三个查询有效吗?如果NULL和empty column/string得到不同的对待,我会理解,但为什么第二次查询不起作用?将转换为VARCHAR(3)也没有帮助 谢谢 表格: CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `fullname` varbinary(100) NOT NULL, `is_disabled` enum('Yes') DEFAULT NULL

有人能告诉我为什么只有第三个查询有效吗?如果
NULL
empty column/string
得到不同的对待,我会理解,但为什么第二次查询不起作用?将
转换为
VARCHAR(3)
也没有帮助

谢谢

表格:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `fullname` varbinary(100) NOT NULL,
  `is_disabled` enum('Yes') DEFAULT NULL,
  `is_terminated` enum('Yes') DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled              - is_terminated
1  - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled != 'Yes' /* is_disabled <> 'Yes' */
    AND
    is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled = '' /* is_disabled IS NULL */
    AND
    is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    (is_disabled = '' OR is_disabled IS NULL)
    AND
    (is_terminated = '' OR is_terminated IS NULL)
数据:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `fullname` varbinary(100) NOT NULL,
  `is_disabled` enum('Yes') DEFAULT NULL,
  `is_terminated` enum('Yes') DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled              - is_terminated
1  - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled != 'Yes' /* is_disabled <> 'Yes' */
    AND
    is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled = '' /* is_disabled IS NULL */
    AND
    is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    (is_disabled = '' OR is_disabled IS NULL)
    AND
    (is_terminated = '' OR is_terminated IS NULL)
查询1:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `fullname` varbinary(100) NOT NULL,
  `is_disabled` enum('Yes') DEFAULT NULL,
  `is_terminated` enum('Yes') DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled              - is_terminated
1  - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled != 'Yes' /* is_disabled <> 'Yes' */
    AND
    is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled = '' /* is_disabled IS NULL */
    AND
    is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    (is_disabled = '' OR is_disabled IS NULL)
    AND
    (is_terminated = '' OR is_terminated IS NULL)
查询3:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `fullname` varbinary(100) NOT NULL,
  `is_disabled` enum('Yes') DEFAULT NULL,
  `is_terminated` enum('Yes') DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled              - is_terminated
1  - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled != 'Yes' /* is_disabled <> 'Yes' */
    AND
    is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled = '' /* is_disabled IS NULL */
    AND
    is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
    AND
    (is_disabled = '' OR is_disabled IS NULL)
    AND
    (is_terminated = '' OR is_terminated IS NULL)

NULL
相比的任何内容都是
NULL

SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL

NULL
相比的任何内容都是
NULL

SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL

在MySQL中,
NULL
不同于
空字符串。所以
column=''
不等于
column为NULL

SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL
由于
条件,第三个查询的工作方式与您预期的一样。让我举例说明

d = '1' AND (is_disabled = '' OR is_disabled IS NULL) AND (is_terminated = '' OR is_terminated IS NULL)
 TRUE   AND (          TRUE   OR           FALSE)     AND (FALSE OR TRUE)
 TRUE   AND                  TRUE                     AND      TRUE
 .... making the condition ALL TRUE

第二个查询失败,因为这个条件
被终止='
,它返回到
NULL
使整个
WHERE
条件
NULL

在MySQL中,
NULL
空字符串不同。所以
column=''
不等于
column为NULL

SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL
由于
条件,第三个查询的工作方式与您预期的一样。让我举例说明

d = '1' AND (is_disabled = '' OR is_disabled IS NULL) AND (is_terminated = '' OR is_terminated IS NULL)
 TRUE   AND (          TRUE   OR           FALSE)     AND (FALSE OR TRUE)
 TRUE   AND                  TRUE                     AND      TRUE
 .... making the condition ALL TRUE

第二个查询失败,因为此条件
被终止='
,返回到
NULL
使整个
在其中
条件
NULL

您可以将此
(被禁用=''或被禁用为NULL)
更改为此
如果为NULL(被禁用,')=''
@Justin尽管这在语法上是有效的,但这种情况可能会阻止在禁用的
上使用索引。首选第一种形式。您可以将此
(is_disabled=''或is_disabled is NULL)
更改为此
ifnull(is_disabled'')='
@Justin尽管这在语法上是有效的,但这种情况可能会阻止在
is_disabled
上使用索引。首选第一种形式。
NULL
的计算结果为
FALSE
并不完全正确,因为
notnull=NULL
的计算结果不是
TRUE
。更好的方法是说“
NULL
的计算结果不是
TRUE
”。三元逻辑可能非常混乱……的确如此,而且它的计算结果也不是
FALSE
。事实上,它的评估结果是<代码>空值
;)谢谢,我修正了。
NULL
的计算结果为
FALSE
并不完全正确,因为
notnull=NULL
的计算结果不是
TRUE
。更好的方法是说“
NULL
的计算结果不是
TRUE
”。三元逻辑可能非常混乱……的确如此,而且它的计算结果也不是
FALSE
。事实上,它的评估结果是<代码>空值
;)谢谢,我修好了。
SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL