除以零的处理方式不同
Posted
技术标签:
【中文标题】除以零的处理方式不同【英文标题】:Division by zero handled differently 【发布时间】:2018-10-02 02:47:13 【问题描述】:我不确定之前是否已在 S.O 中回答过这个问题,但我在谷歌上找不到任何答案来解释各种数据库中的这种行为。所以我想我会在这里向专家澄清这一点。
当我在 Oracle、Postgresql、mysql 和 sql-server 中运行此查询时,我得到了不同的结果。
Oracle 11g
select count(1/0) from dual;
ORA-01476: 除数为零
http://sqlfiddle.com/#!4/e0ee9e/751
SQL-Server 2017
select count(1/0) ;
1
但是select 1/0
给出错误。
遇到除以零错误
http://sqlfiddle.com/#!18/2be41/2
http://sqlfiddle.com/#!18/185a6/7
PostgreSQL 9.6
错误:除以零
http://sqlfiddle.com/#!17/340e0/80
Mysql 5.6
select count(1/0) ;
0
http://sqlfiddle.com/#!9/2be41/10
为什么在实现上有这些差异?
【问题讨论】:
您好 Kaushik,很高兴看到您提出问题。感谢您提出罕见但很好的问题。 【参考方案1】:count()
计算表达式的行数或非NULL
值。
当表达式为常数时,则返回行数。
您看到的是何时以及是否评估常量的问题,以及数据库处理这种情况的不同方式。
Oracle 和 Postgres 显然正在尝试评估该常量。老实说,我不确定这些是运行时错误还是编译时错误。
SQL Server 将评估推迟到需要时——而且从不需要。所以,它会计算行数。
MySQL 很奇怪。它返回 NULL
用于除以零。这不是标准行为,但也并非完全不合理。 COUNT(NULL)
返回0
。
【讨论】:
sql server 的解释对我来说没有意义。为什么count(1/0)
不会抛出类似于1/0
的错误?
@JoePhillips。 . .这是一个示例:rextester.com/WXPT30639.【参考方案2】:
在mysql中有一个特定的模式(启用或禁用)
ERROR_FOR_DIVISION_BY_ZERO
管理这种情况,在你的情况下似乎 禁用(您应该检查正确的模式值),因此您显然会看到错误(或意外结果),但这只是错误处理的配置
https://dev.mysql.com/doc/refman/5.7/en/precision-math-expressions.html
【讨论】:
以上是关于除以零的处理方式不同的主要内容,如果未能解决你的问题,请参考以下文章