Spec-Zone.ru › MySQL 8.4

14.24.3 Обработка выражений

При точных математических расчётах, точные значения чисел используются по возможности. Например, числа в сравнениях используются точно, без изменения значения. В строгом режиме SQL, для INSERT в столбец с точным типом данных (DECIMAL или целое число), число вставляется с его точным значением, если оно находится в диапазоне столбца. При извлечении значение должно быть таким же, как и при вставке. (Если строгий режим SQL не включён, усечение для INSERT допустимо.)

Обработка числового выражения зависит от типа значений, которые содержит выражение:

  • Если присутствуют приблизительные значения, выражение является приблизительным и вычисляется с помощью арифметики с плавающей запятой.

  • Если приблизительных значений нет, выражение содержит только точные значения. Если какое-либо точное значение содержит дробную часть (значение после десятичной точки), выражение вычисляется с помощью точной арифметики с фиксированной точкой (DECIMAL) и имеет точность 65 цифр. Термин “точный” ограничен пределами того, что может быть представлено в двоичной форме. Например, 1.0/3.0 может быть приближен в десятичной записи как .333..., но не может быть записан как точное число, поэтому (1.0/3.0)*3.0 не вычисляется точно как 1.0.

  • В противном случае выражение содержит только целые значения. Выражение является точным и вычисляется с помощью целочисленной арифметики и имеет точность, такую же, как у BIGINT (64 бита).

Если числовое выражение содержит какие-либо строки, они преобразуются в значения с двойной точностью с плавающей запятой, и выражение становится приблизительным.

Вставки в числовые столбцы зависят от режима SQL, который управляется системной переменной sql_mode. (См. Раздел 7.1.11, «Режимы SQL сервера».) Далее упоминается строгий режим (выбранный значениями режима STRICT_ALL_TABLES или STRICT_TRANS_TABLES) и ERROR_FOR_DIVISION_BY_ZERO. Чтобы включить все ограничения, можно просто использовать режим TRADITIONAL, который включает в себя как значения строгого режима, так и ERROR_FOR_DIVISION_BY_ZERO:

SET sql_mode='TRADITIONAL';

Если число вставляется в столбец точного типа (DECIMAL или целое число), оно вставляется с его точным значением, если оно находится в пределах диапазона и точности столбца.

Если значение имеет слишком много цифр в дробной части, происходит округление, и генерируется заметка. Округление выполняется, как описано в Раздел 14.24.4, «Поведение округления». Усечение из-за округления дробной части не является ошибкой, даже в строгом режиме.

Если значение имеет слишком много цифр в целой части, оно слишком велико (выходит за пределы диапазона) и обрабатывается следующим образом:

  • Если строгий режим не включен, значение усекается до ближайшего допустимого значения, и генерируется предупреждение.

  • Если строгий режим включен, возникает ошибка переполнения.

Подпоточные переполнения не обнаруживаются, поэтому обработка подпоточных переполнений не определена.

Для вставки строк в числовые столбцы преобразование строки в число обрабатывается следующим образом, если строка содержит нечисловые символы:

  • Строка, которая не начинается с числа, не может быть использована как число и приводит к ошибке в строгом режиме или предупреждению в противном случае. Это включает в себя пустую строку.

  • Строка, которая начинается с числа, может быть преобразована, но при этом усекается конечная нечисловая часть. Если усеченная часть содержит что-либо кроме пробелов, это приводит к ошибке в строгом режиме или предупреждению в противном случае.

По умолчанию деление на ноль приводит к результату NULL и без предупреждения. Установив режим SQL соответствующим образом, деление на ноль можно ограничить.

С включенным режимом SQL ERROR_FOR_DIVISION_BY_ZERO, MySQL обрабатывает деление на ноль по-другому:

  • Если строгий режим не включен, возникает предупреждение.

  • Если строгий режим включен, вставки и обновления, включающие деление на ноль, запрещены, и возникает ошибка.

Другими словами, вставки и обновления, включающие выражения, выполняющие деление на ноль, могут рассматриваться как ошибки, но это требует ERROR_FOR_DIVISION_BY_ZERO в дополнение к строгому режиму.

Предположим, что у нас есть следующее утверждение:

INSERT INTO t SET i = 1/0;

Вот что происходит для комбинаций режимов строгий и ERROR_FOR_DIVISION_BY_ZERO.

sql_mode Значение Результат
'' (По умолчанию) Без предупреждения, без ошибки; i установлено в NULL.
строгий Без предупреждения, без ошибки; i установлено в NULL.
ERROR_FOR_DIVISION_BY_ZERO Предупреждение, без ошибки; i установлено в NULL.
строгий,ERROR_FOR_DIVISION_BY_ZERO Состояние ошибки; строка не вставляется.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/precision-math-expressions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API