14

MySQL 提供了一个很好的运算符<=>,可以处理可能包含 null 的比较,例如null <=> nullornull <=> 5等​​。与许多编程语言一样,返回直观的结果。而普通的 equals 运算符总是只返回 null,这让许多新的 MySQL 用户(比如我自己)犯了错误。

是否有原因 MySQL 两者兼而有之,而不仅仅是其中的功能<=>?谁真正需要使用内置语言类型有效地未定义的运算符?

4

5 回答 5

14

谁真正需要使用内置语言类型有效地未定义的运算符?

您要求提供一些真实世界的示例。这是一个虚假的。假设您有一个住宿青年计划或类似项目,其中一个要求是孩子们只能与同性的人共用一个房间。您的数据库中有一个可为空的 M/F 字段 - 可以为空,因为您的数据馈送不完整(您仍在追踪一些数据)。你的房间匹配代码绝对不应该匹配 t1.Gender<=>t2.Gender 的学生,因为它最终可能匹配两个性别未知的孩子,他们可能是异性。相反,您匹配它们相等而不是两者都为空的位置。

这只是一个例子。我承认这些年来操作符NULL=操作符的行为引起了很多混乱,但归根结底,错误可能在于过多的在线 MySQL 教程,没有提及如何NULL与操作符交互,也没有提及操作符的存在<=>

于 2013-05-09T14:01:17.810 回答
10

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

在 mySQL 中,null 不等于 null(未知不等于未知)。在编程语言中,null 确实等于 null(未定义等于未定义)。

于 2012-04-05T23:19:20.033 回答
4

谁真正需要使用内置语言类型有效地未定义的运算符?

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

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

如果NULL = NULLtrue,那么在我的示例中,员工表中的外键总是有可能也是NULL。因此,该任务将分配给一名或几名员工。而且您永远无法确定某项任务是否已分配给某个员工。

于 2015-04-17T09:33:09.793 回答
3

MySql 两者兼有而不仅仅是 <=> 中的功能是否有原因?运营商完全不同。

<=>像运算符一样执行相等比较=,但返回1而不是NULL如果两个操作数都是NULL0而不是NULL如果一个操作数是NULL

谁真正需要使用内置语言类型有效地未定义的运算符?

这个要看具体情况,你没遇到过这种情况,不代表没人需要。

于 2012-04-05T23:28:40.667 回答
3

是的。

这一定是因为关系数据库使用了三值逻辑TRUE, NULL, FALSE)的理论。

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

它遵循数学规则。

与 NULL 和三值逻辑的比较

于 2017-06-23T13:22:00.040 回答