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.