是否有理由不在mysql中使用<=>(空安全等于运算符)而不是=?

Posted

技术标签:

【中文标题】是否有理由不在mysql中使用<=>(空安全等于运算符)而不是=?【英文标题】:Is there a reason not to use <=> (null safe equals operator) in mysql instead of =? 【发布时间】:2012-04-19 16:57:08 【问题描述】:

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

是否有原因 MySQL 拥有这两者而不只是 &lt;=&gt; 中的功能?谁真的需要使用内置语言类型有效地未定义的运算符?

【问题讨论】:

【参考方案1】:

null 在 mySQL 和编程语言中的最大区别在于,在 mySQL 中,null 表示 unknown 值,而在编程中表示 undefined 值。

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

【讨论】:

是的,但这有合理的原因吗?这让哪些现实世界的问题变得更容易了?【参考方案2】:

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

&lt;=&gt; 执行类似于= 运算符的相等比较,但如果两个操作数都是NULL,则返回1 而不是NULL,如果一个操作数是@987654328,则返回0 而不是NULL @。

谁真正需要一个实际上未定义的运算符 语言类型?

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

【讨论】:

谁能想到任何案例?因为我无法回想在十多年的专业发展中我可以在哪里使用 = 的行为而不是 的行为。 我可以看到 if = 的使用提供了不同的行为,但是当与 NULL 一起使用时它不会提供任何行为,因为只要表达式中存在 null,结果始终为 null.. @cellige 与 NULL 文字一起使用时,它不提供(合理、有用的)行为。但是当比较两个非文字和可为空的表达式时,它肯定会做一些有人可能合理希望它做的事情。【参考方案3】:

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

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

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

【讨论】:

很好的例子。解释并可能详细说明。 null 表达式在字段具有有限数量的可能值时很有用,但允许在应用程序执行的稍后时间点未定义字段? 我会更进一步——我不明白为什么它们只对有限数量的值有用(显然所有 SQL 字段都有有限数量的值,但我假设您的意思是 small 有限数!)Null 值适用于数据值未知的各种情况(无论它们以后是否已知)。【参考方案4】:

谁真正需要一个实际上未定义的运算符 语言类型?

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

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

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

【讨论】:

我认为这不是一个有效的例子;你需要一个 NULL 作为主键才能发生这种情况。 (当 fk 为 NULL 时,这只是一侧)【参考方案5】:

是的。

这一定是因为关系数据库使用了three-valued logic(TRUENULLFALSE)的理论。

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

它遵循数学规则。

Comparisons with NULL and the three-valued logic

【讨论】:

这是我认为最好的答案。

以上是关于是否有理由不在mysql中使用<=>(空安全等于运算符)而不是=?的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何理由不能使用 CSS 在 html 表格中的 <tr> 周围放置边框

有啥理由不在生产版本中启用 CODE_ANALYSIS?

是否有任何理由使用右值引用重载运算符?

哈希和升序索引之间的 Mongodb 性能差异(有啥理由不在无序字段中使用哈希?)

是否有充分的理由对字符串使用文化敏感的比较器?

有啥理由不在 MCU 上增加 .bss 或 .data 部分的大小?