Spec-Zone .ru
спецификации, руководства, описания, API
|
С математикой точности числа точного значения используются как дано когда бы ни было возможно. Например, числа в
сравнениях используются точно как дано без изменения в значении. В строгом режиме SQL, для INSERT
в столбец с точным типом данных (DECIMAL
или целое число), число вставляется с его точным значением, если это
в пределах диапазона столбца. Когда получено, значение должно быть тем же самым как, что было вставлено. (Без
строгого режима, усечения для INSERT
допустимо.)
Обработка числового выражения зависит от того, какие значения выражение содержит:
Если какие-либо приближенные значения присутствуют, выражение приблизительно и оценивается, используя арифметику с плавающей точкой.
Если никакие приближенные значения не присутствуют, выражение содержит только
точные значения. Если какое-либо точное значение содержит дробную часть (значение после десятичной
точки), выражение оценивается, используя DECIMAL
у точной арифметики и есть точность 65 цифр. Термин "точный" подвергается пределам того,
что может быть представлено в двоичном файле. Например, 1.0/3.0
может быть
приближен в десятичной записи как .333...
, но не записанный как точное
число, таким образом, (1.0/3.0)*3.0
не оценивает к точно 1.0
.
Иначе, выражение содержит только целочисленные значения. Выражение точно и
оценивается, используя целочисленную арифметику и имеет точность то же самое как BIGINT
(64 бита).
Если числовое выражение содержит какие-либо строки, они преобразовываются в двойную точность, значения с плавающей точкой и выражение приблизительны.
Вставляет в числовые столбцы, влияются режимом 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 |
Состояние ошибки; никакая строка не вставляется. |
Для вставок строк в числовые столбцы преобразование от строки до числа обрабатывается следующим образом, если у строки есть нечисловое содержание:
Строка, которая не начинается с числа, не может использоваться в качестве числа и производит ошибку в строгом режиме, или предупреждение иначе. Это включает пустую строку.
Строка, которая начинается с числа, может быть преобразована, но запаздывающая нечисловая часть является усеченной. Если усеченная часть содержит что-нибудь кроме пробелов, это производит ошибку в строгом режиме, или предупреждение иначе.