是否有理由不在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 提供了一个很好的运算符<=>
,它可以处理可能包含空值的比较,例如null <=> null
或null <=> 5
等。与许多编程语言一样,返回直观的结果。而普通的 equals 运算符总是只返回 null,这让许多 MySQL 新用户(例如我自己)犯了错误。
是否有原因 MySQL 拥有这两者而不只是 <=>
中的功能?谁真的需要使用内置语言类型有效地未定义的运算符?
【问题讨论】:
【参考方案1】:null 在 mySQL 和编程语言中的最大区别在于,在 mySQL 中,null 表示 unknown 值,而在编程中表示 undefined 值。
在 mySQL 中,null 不等于 null(未知不等于未知)。在编程语言中,null 确实等于 null(未定义等于未定义)。
【讨论】:
是的,但这有合理的原因吗?这让哪些现实世界的问题变得更容易了?【参考方案2】:MySql 两者兼有,而不仅仅是 中的功能是否有原因? ? 运营商完全不同。
<=>
执行类似于=
运算符的相等比较,但如果两个操作数都是NULL
,则返回1
而不是NULL
,如果一个操作数是@987654328,则返回0
而不是NULL
@。
谁真正需要一个实际上未定义的运算符 语言类型?
这要看情况,你没遇到过这种情况,不代表没人需要。
【讨论】:
谁能想到任何案例?因为我无法回想在十多年的专业发展中我可以在哪里使用 = 的行为而不是 的行为。 我可以看到 if = 的使用提供了不同的行为,但是当与 NULL 一起使用时它不会提供任何行为,因为只要表达式中存在 null,结果始终为 null.. @cellige 与 NULL 文字一起使用时,它不提供(合理、有用的)行为。但是当比较两个非文字和可为空的表达式时,它肯定会做一些有人可能合理希望它做的事情。【参考方案3】:谁真的需要使用内置语言类型有效地未定义的运算符?
您要求提供一些真实世界的示例。这是一个虚假的。 假设您有一个住宿青年计划或类似项目,其中一个要求是孩子们只能与同性的人共用一个房间。您的数据库中有一个可为空的 M/F 字段 - 可以为空,因为您的数据馈送不完整(您仍在追踪一些数据)。 你的房间匹配代码绝对不应该匹配 t1.Gendert2.Gender 的学生,因为它最终可能匹配两个性别未知的孩子,他们可能是异性。相反,您匹配它们相等而不是两者都为空的位置。
这只是一个例子。我承认NULL
和=
运算符的行为这些年来引起了很多混乱,但最终的错误可能在于过多的在线MySQL 教程没有提及NULL
如何与运算符交互, 也不存在 <=>
运算符。
【讨论】:
很好的例子。解释并可能详细说明。null
表达式在字段具有有限数量的可能值时很有用,但允许在应用程序执行的稍后时间点未定义字段?
我会更进一步——我不明白为什么它们只对有限数量的值有用(显然所有 SQL 字段都有有限数量的值,但我假设您的意思是 small 有限数!)Null 值适用于数据值未知的各种情况(无论它们以后是否已知)。【参考方案4】:
谁真正需要一个实际上未定义的运算符 语言类型?
您还需要它来处理数据库中的关系。特别是如果您使用外键约束。
例如,如果您有一个任务表(在您的公司中)。然后您将这些任务分配给员工。因此,您的任务表与员工表之间存在关系。
并且总会有一些未分配的任务。在这种情况下,您用于与员工表的关系的任务表中的字段将包含NULL
。
这将确保该任务未分配。这意味着:不可能与雇员表存在关系。
如果NULL = NULL
是true
,那么在我的示例中,员工表中的外键也总是有可能是NULL
。因此,该任务将分配给一名或几名员工。而且您永远无法确定某项任务是否分配给了某个员工。
【讨论】:
我认为这不是一个有效的例子;你需要一个 NULL 作为主键才能发生这种情况。 (当 fk 为 NULL 时,这只是一侧)【参考方案5】:是的。
这一定是因为关系数据库使用了three-valued logic(TRUE
,NULL
,FALSE
)的理论。
而且三值逻辑必须如此,因为它必须是内部一致的。
它遵循数学规则。
Comparisons with NULL and the three-valued logic
【讨论】:
这是我认为最好的答案。以上是关于是否有理由不在mysql中使用<=>(空安全等于运算符)而不是=?的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何理由不能使用 CSS 在 html 表格中的 <tr> 周围放置边框