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
为什么这些差异在实施中?
count()计算NULL表达式的行数或非值.
当表达式是常量时,它返回行数.
您所看到的是关于何时以及是否评估常量的问题,以及数据库处理这种情况的不同方式.
Oracle和Postgres显然正试图评估常量.说实话,我不确定这些是运行时还是编译时错误.
SQL Server将评估推迟到需要时 - 它永远不需要.因此,它计算行数.
MySQL是一个奇怪的.它返回NULL为零除.这不是标准行为,但也不完全不合理. COUNT(NULL)回报0.
在mysql中有一个特定的模式(启用或禁用)
ERROR_FOR_DIVISION_BY_ZERO
管理这种情况,在你的情况下似乎禁用(你应该检查正确的模式值),所以你显然看到一个错误的(或意外的结果),但只是一个错误处理的配置
https://dev.mysql.com/doc/refman/5.7/en/precision-math-expressions.html
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |