MySQL:选择列为空的行

我有一个问题,当我试图选择有一个NULL为某列的行,它返回一个空集。然而,当我在phpMyAdmin中查看表时,它对大多数行表示为空。

我的问题是这样的:

SELECT pid FROM planets WHERE userid = NULL

每次都是空集。

很多地方都说要确保它不是存储为“NULL”或“NULL”,而不是一个实际的值,还有一个地方说要尝试只寻找一个空格(userid = ' '),但这些都没有工作。有人建议不要使用MyISAM,而使用innoDB,因为MyISAM存储null有问题。我把表切换到innoDB,但现在我觉得问题可能是它实际上仍然不是空的,因为它可能转换的方式。我希望这样做,而不必重新创建表为innoDB或其他任何东西,但如果我必须这样做,我当然可以尝试一下。

464135 次浏览

SQL NULL是特殊的,你必须执行WHERE field IS NULL,因为NULL不能等于任何东西,

包括自身(即:NULL = NULL总是假的)。

参见Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules

SELECT pid FROM planets WHERE userid IS NULL

http://w3schools.com/sql/sql_null_values.asp中的信息:

1)空值表示缺失未知数据。

2)默认情况下,表列可以保存NULL值。

3) NULL值与其他值区别对待

4)不可能比较NULL和0;它们不相等。

5)不可能通过比较测试NULL值 操作符,如=、<或<>.

6)我们将不得不使用IS NULL和IS NOT NULL操作符代替

所以如果你遇到了问题

SELECT pid FROM planets WHERE userid IS NULL

既然已经给出了答案,我想再补充一点。我也遇到过同样的问题。

为什么你的查询失败了?你有,

SELECT pid FROM planets WHERE userid = NULL;

这不会给你预期的结果,因为从mysql文档

在SQL中,NULL值与任何其他值相比,即使是NULL值,也永远不为真。一个包含NULL的表达式总是产生一个NULL值,除非在该表达式中涉及的操作符和函数的文档中另有说明。

我特别强调。

要搜索NULL的列值,不能使用expr = NULL测试。下面的语句不返回任何行,因为expr = NULL对任何表达式都不为真

解决方案

SELECT pid FROM planets WHERE userid IS NULL;

要测试NULL,使用IS NULLIS NOT NULL操作符。

在将数据库从Access转换为MySQL(使用vb.net与数据库通信)时,我也遇到了同样的问题。

我需要评估字段(字段类型varchar(1))是否为空。

这句话适用于我的场景:

SELECT * FROM [table name] WHERE [field name] = ''

还有一个<=>操作符:

SELECT pid FROM planets WHERE userid <=> NULL

是可行的。<=>也可以用于非null值:

SELECT NULL <=> NULL产生1

SELECT 42 <=> 42也会产生1

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

有相同的问题查询:

SELECT * FROM 'column' WHERE 'column' IS NULL;

没有返回值。 MyISAM似乎有问题,在InnoDB中对数据进行相同的查询返回了预期的结果

跟着:

SELECT * FROM 'column' WHERE 'column' = ' ';

返回所有预期结果。

SELECT pid FROM planets WHERE userid is null;