MySQL:选择列为空的行

时间:2010-08-21 06:50:26

标签: mysql null

我遇到了一个问题,当我尝试为某个列选择具有NULL的行时,它会返回一个空集。但是,当我在phpMyAdmin中查看表时,它对大多数行都显示为null。

我的查询看起来像这样:

SELECT pid FROM planets WHERE userid = NULL

每次都清空。

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

8 个答案:

答案 0 :(得分:468)

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

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

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

答案 1 :(得分:58)

SELECT pid FROM planets WHERE userid IS NULL

答案 2 :(得分:35)

由于所有人都给出了答案,我想补充一点。我也面临同样的问题。

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

SELECT pid FROM planets WHERE userid = NULL;

这不会给您预期的结果,因为来自mysql doc

  

在SQL中,与任何其他值相比,NULL值永远不会为真,甚至是NULL。包含NULL的表达式总是产生NULL值,除非在文档中为运算符和函数另有说明参与表达。

强调我的。

  

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

解决方案

SELECT pid FROM planets WHERE userid IS NULL; 

要测试NULL,请使用IS NULLIS NOT NULL运算符。

答案 3 :(得分:12)

还有<=>运算符:

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

答案 4 :(得分:11)

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

  

1)NULL值表示缺少未知数据。

     

2)默认情况下,表列可以包含NULL值。

     

3)NULL值的处理方式与其他值不同

     

4)无法比较NULL和0;它们并不等同。

     

5)无法通过比较测试NULL值   运算符,例如=,&lt;或&lt;&gt;。

     

6)我们将不得不使用IS NULL和IS NOT NULL运算符

所以如果您遇到问题:

SELECT pid FROM planets WHERE userid IS NULL

答案 5 :(得分:8)

查询时遇到同样的问题:

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

没有返回任何值。 似乎是MyISAM的一个问题,对InnoDB中的数据的相同查询返回了预期的结果。

跟着:

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

返回所有预期结果。

答案 6 :(得分:2)

SELECT pid FROM planets WHERE userid is null;

答案 7 :(得分:0)

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

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

此声明适用于我的场景:

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