除以零的处理方式不同

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

【讨论】:

以上是关于除以零的处理方式不同的主要内容,如果未能解决你的问题,请参考以下文章

Java基础 try...catch 处理ArithmeticException 除以零的异常

无论结果如何,支持除以零的最快整数除法是啥?

在 CSV 导出中处理零的不同解决方案

Erlang中除以零的精确异常类型

浮点除以零的行为

对多个熊猫列进行排序并计算大于零的值百分比