MySQL:选择列为空的行

The*_*i.9 255 mysql null

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

我的查询看起来像这样:

SELECT pid FROM planets WHERE userid = NULL
Run Code Online (Sandbox Code Playgroud)

每次都清空.

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

Mar*_*c B 490

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

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

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

  • NULL = NULL实际上不是FALSE - 它再次为NULL.但它也不是TRUE,所以IF(NULL = NULL)不会执行. (38认同)
  • 它是未知的 - 不是假的.SQL使用三值逻辑. (24认同)
  • null 不仅不等于任何东西,而且也不等于任何东西。换句话说,`select * from foo where bar <> "abc"`将*不会*返回bar为空的行。今天这让我大吃一惊。文档将“<>”称为“不等于”运算符,但实际上它是“等于”运算符。 (2认同)

Mic*_*sov 64

SELECT pid FROM planets WHERE userid IS NULL
Run Code Online (Sandbox Code Playgroud)


Ani*_*rni 38

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

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

SELECT pid FROM planets WHERE userid = NULL;
Run Code Online (Sandbox Code Playgroud)

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

在SQL中,与任何其他值相比,NULL值永远不会为真,即使是NULL.包含NULL的表达式始终生成NULL值,除非文档中对表达式中涉及的运算符和函数另有说明.

强调我的.

要搜索列值NULL,您不能使用expr = NULL测试.以下语句不返回任何行,因为任何表达式都不会返回expr = NULL

SELECT pid FROM planets WHERE userid IS NULL; 
Run Code Online (Sandbox Code Playgroud)

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


obe*_*obe 13

还有一个<=>运营商:

SELECT pid FROM planets WHERE userid <=> NULL
Run Code Online (Sandbox Code Playgroud)

会工作.好的是,<=>它也可以与非NULL值一起使用:

SELECT NULL <=> NULL收益率1.

SELECT 42 <=> 42收益率1也是如此.

请参见:https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to


min*_*s23 11

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

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

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

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

4)无法比较NULL和0; 他们不等同.

5)无法使用比较运算符测试NULL值,例如=,<或<>.

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

所以如果你的问题:

SELECT pid FROM planets WHERE userid IS NULL
Run Code Online (Sandbox Code Playgroud)


Ric*_*nny 8

有同样问题的地方查询:

SELECT * FROM 'column' WHERE 'column' IS NULL; 
Run Code Online (Sandbox Code Playgroud)

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

跟着:

SELECT * FROM 'column' WHERE 'column' = ' '; 
Run Code Online (Sandbox Code Playgroud)

返回所有预期结果.


小智 5

SELECT pid FROM planets WHERE userid is null;
Run Code Online (Sandbox Code Playgroud)