是否有理由不使用< => (null safe equals operator)在mysql而不是=?

时间:2012-04-05 23:13:04

标签: mysql null operators equals equals-operator

MySQL提供了一个很好的运算符<=>,它可以处理包含空值的比较,例如null <=> nullnull <=> 5等,可以像许多编程语言一样提供直观的结果。正常的equals运算符总是只返回null,这会吸引许多新的MySQL用户,比如我自己的错误。

MySQL是否同时具有<=>中的功能?谁真的需要一个内置语言类型有效未定义的运算符?

5 个答案:

答案 0 :(得分:10)

  

谁真的需要一个内置语言类型有效未定义的运算符?

你问了一些现实世界的例子。这是一个虚假的。 假设你有一个住宿青年计划或类似的,其中一个要求是孩子们只与同性别的人共用一个房间。您的数据库中有一个可以为空的M / F字段 - 可以为空,因为您的数据提要不完整(您仍在追逐某些数据)。 您的房间匹配代码绝对不能与t1.Gender&lt; =&gt; t2.Gender的学生匹配,因为它最终可能会匹配两个性别不明的孩子,他们可能是性别相反的。相反,你匹配它们相等的位置,而不是都是空的。

这只是一个例子。我承认NULL=运算符的行为多年来引起了很多混乱,但最终的错误可能在于过多的在线MySQL教程没有提及{{{ 1}}与运算符交互,也不存在NULL运算符。

答案 1 :(得分:6)

mySQL和编程语言中null之间的最大区别在于,在mySQL中,null表示未知值,而在编程中则表示未定义值。

在mySQL中,null不等于null(unknown不等于unknown)。在编程语言中,null确实等于null(undefined等于undefined)。

答案 2 :(得分:4)

  

谁真的需要一个有效的未定义的运算符   在语言类型?

您还需要它来处理数据库中的关系。特别是如果您使用外键约束。

例如,如果您有一个任务表(在您的公司中)。然后将这些任务分配给员工。所以你有一个从你的任务表到你的员工表的关系 总会有一些未分配的任务。在这种情况下,您用于与employees表的关系的tasks-table中的字段将包含NULL。 这将确保此任务未分配。这意味着:不可能与employees表有关系。

如果NULL = NULLtrue,那么在我的示例中,employees表中的外键也总是NULL。因此,任务将分配给一个或一些员工。并且你永远无法确定是否将任务分配给某个员工。

答案 3 :(得分:2)

  

MySql是否同时具有&lt; =&gt;中的功能?   ?   运营商彼此完全不同。

<=>执行与=运算符类似的相等比较,但如果两个操作数均为1,则返回NULL而不是NULL0如果一个操作数是NULL,而不是NULL

  

谁真的需要一个有效的未定义的运算符   在语言类型?

这取决于案例,仅仅因为你没有遇到过这种情况,并不意味着没有人需要它。

答案 4 :(得分:1)

这必须是因为关系数据库使用three-valued logicTRUENULLFALSE)的理论。

三值逻辑必须工作,因为它必须是内部一致的。

遵循数学规则。

Comparisons with NULL and the three-valued logic