Разделение на ноль обрабатывается по-разному

Kaushik Nayak спросил: 28 марта 2018 в 02:24 в: mysql

Я не уверен, ответили ли ранее в 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/#!9/2be41/10

Почему эти различия в реализациях?

2 ответа

Есть решение
Gordon Linoff ответил: 28 марта 2018 в 02:28

count() подсчитывает количество строк или не-NULL значения выражения.

Если выражение является константой, оно возвращает число строк.

Вы видите вопрос о том, когда и когда оценивается константа, и о том, как базы данных справляются с этой ситуацией.

Oracle и Postgres явно пытаются оценить постоянную. Честно говоря, я не уверен, являются ли они ошибками во время выполнения или во время компиляции.

SQL Server откладывает оценку до тех пор, пока она не понадобится - и она никогда не понадобится. Таким образом, он считает количество строк.

MySQL - странная. Возвращает NULL для деления на ноль. Это не стандартное поведение, но также и не совсем необоснованное. COUNT(NULL) возвращает 0.

iSR5 ответил: 28 марта 2018 в 09:54
может быть, это также поддержит bugs.mysql.com/bug.php?id=8423
Joe Phillips ответил: 22 апреля 2018 в 11:04
Объяснение сервера sql не имеет смысла для меня. Почему бы count(1/0) не выдать ошибку, похожую на 1/0?
Gordon Linoff ответил: 22 апреля 2018 в 01:14
@JoePhillips. , , Вот пример: rextester.com/WXPT30639.
Yogesh Sharma scaisEdge ответил: 22 апреля 2018 в 11:00

В mysql есть определенный режим (включенный или отключенный)

ERROR_FOR_DIVISION_BY_ZERO

, который управляет этой ситуацией и в вашем случае кажется недоступным (вы должны проверить правильное значение режима), так что вы, очевидно, видите неправильный (или неожиданный результат), но это просто конфигурация для обработки ошибок

https://dev.mysql.com/doc/refman/5.7/en/precision- математика-expressions.html