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.