Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么“WHERE column”给出的结果与“WHERE column不为NULL且column''”不同?_Mysql - Fatal编程技术网

Mysql 为什么“WHERE column”给出的结果与“WHERE column不为NULL且column''”不同?

Mysql 为什么“WHERE column”给出的结果与“WHERE column不为NULL且column''”不同?,mysql,Mysql,我有两列,area和block,其中area是int类型,block是varchar 现在我写两个问题: select * from table where area and block; select * from table where area is not null and area <> '' and block is not null and block <> ''; 我在运行这些查询时得到了不同的结果集。他们之

我有两列,area和block,其中area是int类型,block是varchar

现在我写两个问题:

select * from table where area and block;

select * from table where area is not null and area <> ''
                      and block is not null and block <> '';
我在运行这些查询时得到了不同的结果集。他们之间可能有什么不同


我认为上面的查询返回区域和块都存在的位置,而第二个查询应该返回相同的内容。

第二个查询的行为是正常的,尽管不为null,但它是多余的,因为

这里的怪癖出现在第一个查询中。MySQL对于隐式类型转换的好坏都非常慷慨。它通过隐式地将求值表达式的值转换为布尔值(在MySQL世界中,布尔值为),将不带no的裸表达式视为有效谓词

您的块列是一个varchar。MySQL显示了当作为裸表达式谓词提供时,此列中的值将如何隐式转换为布尔read:integer值:

以下示例演示了将字符串转换为数字的过程 比较操作:

mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1
这里暗示的是,如果字符串以一个数字开头,MySQL猜测该数字一定是您想要的数字,但没有明确说明;否则, 猜零。因此,如果块中的值恰好是“a”,则第一个查询将隐式地将该值转换为0,并过滤掉该行,因为WHERE area和0永远不会为真。如果您来自一种在布尔上下文中将非空字符串视为true的语言,那么这是非常意外的!但是,嘿,这是MySQL。。。过了一段时间,你就会学会放弃期望


第二个查询不执行任何隐式转换,因为;'“a”显然不等于,也不为null,因此这两个谓词都为true,并且该行不会从结果集中筛选出来。

这是两个非常不同的查询没有比较运算符的where子句生成的内容的链接吗?在sqlFiddle上尝试时,我无法使用可为null的varchar得到任何结果:请看,如果varchar包含int,那么它可以在varchar上工作?是的,但为什么?这就是我要问的?可能还有更多的病例