Spec-Zone.ru › MySQL 9.2

14.25.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.25.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-9.2-en/precision-math-expressions.html

Spec-Zone.ru

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