除零处理方式不同

Kau*_*yak 8 mysql sql sql-server oracle postgresql

我不确定之前是否已经回答过这个问题,但我找不到任何答案谷歌搜索在各种数据库中解释这种行为.所以我想我会在这里从专家那里澄清一下.

当我在Oracle,Postgresql,mysql和sql-server中运行此查询时,我得到了不同的结果.

Oracle 11g

select count(1/0) from dual; 
Run Code Online (Sandbox Code Playgroud)

ORA-01476:除数等于零

http://sqlfiddle.com/#!4/e0ee9e/751

SQL-Server 2017

select count(1/0) ;

1
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!9/2be41/10

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

Gor*_*off 6

count()计算NULL表达式的行数或非值.

当表达式是常量时,它返回行数.

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

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

SQL Server将评估推迟到需要时 - 它永远不需要.因此,它计算行数.

MySQL是一个奇怪的.它返回NULL为零除.这不是标准行为,但也不完全不合理. COUNT(NULL)回报0.


sca*_*dge 5

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

ERROR_FOR_DIVISION_BY_ZERO

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

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