【问题标题】: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,很高兴看到您提出问题。感谢您提出罕见但很好的问题。

标签: mysql sql sql-server oracle postgresql


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多