MySQL Null Safe在数字类型上等于不正确吗?

时间:2016-06-06 16:25:22

标签: mysql

这一点我今天看起来像一个错误。似乎在比较MySQL中LOCATE函数的结果时,使用not equals <>与null安全版<=>时它的行为完全不同。请参阅下面的会话:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.25, for osx10.8 (x86_64) using  EditLine wrapper

mysql> SELECT LOCATE('A', "The Apple");
+--------------------------+
| LOCATE('A', "The Apple") |
+--------------------------+
|                        5 |
+--------------------------+
1 row in set (0.00 sec)


mysql> SELECT LOCATE('A', "The Apple") <=> 0; -- WRONG!?
+--------------------------------+
| LOCATE('A', "The Apple") <=> 0 |
+--------------------------------+
|                              0 |
+--------------------------------+
1 row in set (0.00 sec)

mysql> SELECT LOCATE('A', "The Apple") <> 0;
+-------------------------------+
| LOCATE('A', "The Apple") <> 0 |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set (0.00 sec)

null安全版本返回0(false),这对我来说似乎很奇怪。 LOCATE方法的documentation没有指定nulls会发生什么,但是我测试了它并且它确实为LOCATE('A', null)之类的东西返回null,但真正的问题似乎是比较整数{ {1}}返回LOCATE

我检查了documentation on <=>,但它只是说:

  

NULL-safe相等。此运算符执行与=运算符相等的比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL。

这并没有真正告诉我为什么0回来0 <=> 50回来0 <> 5我唯一能想到的是MySQL说:

  

这些操作适用于数字和字符串。根据需要,字符串会自动转换为数字和数字到字符串。

也许有一个自动演员,但这没有任何意义,因为直接进行检查(键入1)显示同样的问题。

有谁知道造成这种情况的原因是什么?或者说明文件中的哪个位置?如果null安全等式操作返回无效结果,那么这似乎是一个非常重要的问题,因为简单的比较为5和0。

1 个答案:

答案 0 :(得分:2)

Null安全平等比较 <=> (太空船)运算符是相等运算符。它的工作方式类似于 = 等式比较运算符,除非有关不返回NULL的位。

获得&#34;不平等&#34;在那个运算符之外,你需要否定它,例如

 SELECT NOT ( 0 <=> 5 )