sql—为什么< >“null”在mysql中工作?

6ss1mwsb  于 2021-06-15  发布在  Mysql
关注(0)|答案(4)|浏览(329)

希望这个问题不要太笼统。在网站或sql文档中找不到任何内容:
在编写代码时,我对其进行了测试,令我惊讶的是,它居然成功了:

SELECT * FROM cal_entry WHERE cal_entry.parent_id <> 'null'

它实际上显示的是没有带 NULL 价值观(这些是真实的 NULL 数据库中的值,而不是字符串 'null' 内部)。
根据文件,我应该用 NOT NULL ,当然。顺便说一句,它不适用于 = 'null' ,就像文档中正确说明的那样。
有人能解释一下吗?

8yoxcaq7

8yoxcaq71#

假设 parent_id 在一个 int 列查询将返回所有非空、非零行:

SELECT *
FROM (
    SELECT NULL AS parent_id UNION ALL
    SELECT 0 UNION ALL
    SELECT 1 UNION ALL
    SELECT 2
) AS cal_entry
WHERE cal_entry.parent_id <> 'null'
-- returns 1 and 2 but not 0!

当比较数字和字符串时,mysql会将字符串转换为数字。一些例子: 'null' 变为0 'asdf' 变为0 '1asdf' 变成
123 '1' 变为1
您的查询将表现为:

WHERE cal_entry.parent_id <> 0
332nm8kg

332nm8kg2#

这个运算符给出的结果不等于。例如$var!=无效的。我们在mysql中编写为<>。这是一种验证,该值永远不应等于null。

5jvtdoz2

5jvtdoz23#

使用null时,应始终注意以下两个语句-
表达式可以为null,但永远不能等于null。
两个空值永远不相等。
所以,在你的查询中,只要有比较 null<>null 第二个语句返回true。
另外,请始终考虑某些行可能包含null-

Select * from cal_entry where cal_entry.parent_id!=10

此查询将省略包含空条目的行。改用-

Select * from cal_entry where cal_entry.parent_id!=10 or cal_entry.parent_id is null
uwopmtnx

uwopmtnx4#

您正在选择其中的所有行 <> 'null' 这是真的。
将(等于或不等于)与null进行比较是null,因此如果一行 cal_entry.parent_id 如果为null,则您的条件将为false/null。
因此,您的查询将获取所有不为null的行,也不包含字符串“null”。
(注意,你也可以写 <>'something_else' )

相关问题