Spec-Zone .ru
спецификации, руководства, описания, API

12.19.3. Обработка выражения

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

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

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

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

mysql> SET
        sql_mode='TRADITIONAL';

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

Если у значения есть слишком много цифр в дробной части, округление происходит, и предупреждение сгенерировано. Округление делается как описано в Разделе 12.19.4, "Округление Поведения".

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

Потеря значимости не обнаруживается, таким образом, обработка потери значимости неопределена.

По умолчанию подразделение нулем приводит к результату NULL и никакое предупреждение. С ERROR_FOR_DIVISION_BY_ZERO Включенный режим SQL, 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 Состояние ошибки; никакая строка не вставляется.

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