除零处理方式不同

时间:2018-04-21 16:04:11

标签: mysql sql sql-server oracle postgresql

我不确定之前是否已经在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

为什么这些差异在实施中?

2 个答案:

答案 0 :(得分:6)

ERROR_FOR_DIVISION_BY_ZERO计算表达式的行数或非count()值。

当表达式为常量时,它返回行数。

您所看到的是关于何时以及是否评估常量的问题,以及数据库处理这种情况的不同方式。

Oracle和Postgres显然正在尝试评估常量。说实话,我不确定这些是运行时错误还是编译错误。

SQL Server推迟评估直到需要 - 并且永远不需要它。因此,它计算行数。

MySQL很奇怪。它返回NULL以进行除零。这不是标准行为,但也不完全不合理。 NULL会返回COUNT(NULL)

答案 1 :(得分:5)

在mysql中有一个特定的模式(启用或禁用)

if(a_type == INT) b.i = a.i; if(a_type == FLOAT) b.f = a.f;

管理这种情况,在你的情况下似乎  禁用(您应检查正确的模式值),因此您显然看到错误(或意外结果),但只是一个错误处理配置

https://dev.mysql.com/doc/refman/5.7/en/precision-math-expressions.html