MySQL поддерживает все стандартные числовые типы SQL. Эти типы включают в себя точные числовые типы (INTEGER, SMALLINT, DECIMAL и NUMERIC), а также приближенные числовые типы (FLOAT, REAL и DOUBLE PRECISION). Ключевое слово INT – это синоним ДЛЯ INTEGER, a DEC – СИНОНИМ ДЛЯ DECIMAL.
В качестве расширения стандарта SQL, MySQL также поддерживает целые типы TINYINT, MEDIUMINT и BIGINT, как перечислено в табл.
Таблица Целые типы данных в MySQL
Тип | Байт | Минимум (знаковое) | Максимум (знаковое) |
TINYINT | 1 | -128 | 127 |
SMALLINT | 2 | -32768 | 32767 |
MEDIUMINT | 3 | -8388608 | 8388607 |
INT | 4 | -2147483648 | 2147483647 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
Другое расширение поддерживается MySQL для необязательного указания ширины отображения целого значения в скобках, которое следует за базовым ключевым словом типа (например, INT(4)). Эта спецификация ширины отображения применяется для дополнения пробелами слева тех чисел, у которых разрядов меньше, чем в ней указано.
Ширина отображения никак не ограничивает ни диапазон допустимых значений столбца, ни количество разрядов для чисел, превышающих указанную ширину.
При использовании совместно с необязательным атрибутом ZEROFILL дополнение пробелами слева заменяется дополнением нулями. Например, для столбца, объявленного как INT(5) ZEROFILL, значение 4 извлекается как 00004. Имейте в виду, что если вы сохраняете значения, количество разрядов в которых больше заданной ширины отображения, то можете столкнуться с проблемами, когда MySQL будет генерировать временные таблицы для некоторых сложных соединений, поскольку в этом случае MySQL предполагает, что данные должны поместиться в отведенную ширину.
Все целые типы могут иметь необязательный (нестандартный) атрибут UNSIGNED (беззнаковое). Беззнаковые значения могут использоваться, когда вы хотите разрешить только неотрицательные значения в столбцах и вам требуется больший верхний предел для них.
Начиная с MySQL 4.0.2, типы с плавающей и фиксированной точкой тоже могут иметь атрибут UNSIGNED. Как и для целых типов, он предотвращает сохранения отрицательных значений в таких столбцах. Однако, в отличие от целых, при этом верхний допустимый предел остается неизменным.
Если вы указываете атрибут ZEROFILL для числового столбца, MySQL автоматически добавляет атрибут UNSIGNED.
DECIMAL и NUMERIC в MySQL реализованы как один и тот же тип. Они применяются для хранения значений, которые должны быть точными, например, для денежных величин. Когда объявляется столбец одного из этих типов, ей можно указать (и обычно так и делается) точность (precision) и масштаб (scale). Например:
salary DECIMAL(5,2)
В этом примере 5 — это точность, а 2 — масштаб. Точность представляет количество значащих десятичных разрядов, а масштаб – количество разрядов после десятичной точки.
MySQL сохраняет DECIMAL и NUMERIC в виде строк вместо того, чтобы хранить в виде двоичных чисел с плавающей точкой, для обеспечения исключительной точности этих значений. При этом используется по одному символу для каждого разряда, один символ -для десятичной точки (если масштаб больше 0), и один-для знака ‘-‘ (для отрицательных значений). Если масштаб равен 0, DECIMAL и NUMERIC не содержат десятичной точки и дробной части.
Стандарт SQL требует, чтобы столбец salary мог хранить любое значение с пятью разрядами и двумя знаками после точки. Поэтому в данном случае диапазон допустимых значений salary составит от-999.99 до 999. 99. MySQL при этом идет двумя путями:
- В положительной области диапазона столбец может хранить значения до 999.99. Для положительных чисел MySQL использует зарезервированный для знака байт,
чтобы учеличить верхний предел диапазона. - До MySQL 3.23 столбцы DECIMAL сохранялись иначе и не могли представлять все значения, которые требовал стандарт SQL. Это было связано с тем, что для типа
DECIMAL {M, D) значение М включало байты для знака и десятичной точки. Таким образом, диапазон значений salary до MySQL 3.23 составлял от-9.99 до 9.99.
В стандартном SQL синтаксис decimal(m) эквивалентен decimal(M,0). Соответственно, синтаксис DECIMAL эквивалентен DECIMAL (М), где М по умолчанию определяется реализацией. Начиная с MySQL 3.23.6, поддерживаются обе формы типов данных DECIMAL и NUMERIC. Значение Afпо умолчанию равно 10. До версии MySQL 3.23.6 значения М и Dдолжны были указываться явно.
Максимальный диапазон значений DECIMAL и NUMERIC такой же как DOUBLE, но фактический диапазон значений конкретного столбца мог быть ограничен точностью и масштабом этой столбца. Когда такому столбцу присваивается значение с большим количеством десятичных разрядов после точки, чем указано в его спецификации масштаба, значение преобразуется в указанный масштаб. (Приведение точности зависит от операционной системы, но обычно это делается просто отбрасыванием лишних разрядов.) Когда в столбец DECIMAL и NUMERIC записывается значение, выходящее за допустимый диапазон, он принимает граничное значение допустимого диапазона.
Для типов столбцов с плавающей точкой MySQL использует четыре байта для значений одинарной точности и восемь для значений двойной точности.
Тип FLOAT применяется для представления приближенных числовых типов данных. Стандарт SQL позволяет указывать необяхательную спецификацию точности (но не диапазон экспоненты) в битах в скобках, следом за ключевым словом FLOAT. Реализация MySQL также поддерживает эту спецификацию точности, но значение точности используется только для указания хранимого размера. Точность от 0 до 23 обеспечивает тип столбца FLOAT одинарной точности. Точность от 24 до 53 – тип столбца DOUBLE двойной точности.
Когда ключевое слово FLOAT используется для типа столбца без спецификации точности, MySQL использует четыре байта для хранения значений. MySQL также поддерживает синтаксис с двумя числами, указанными в скобках после слова FLOAT. При этом первое число указывает отображаемую ширину, а второе – количество разрядов после десятичной точки, которое должно сохраняться и отображаться (так же, как у DECIMAL и NUMERIC). Когда MySQL требуется в данной столбцу сохранить число с большим количеством разрядов после точки, чем указано в спецификации этой столбца, при сохранении значение округляется для исключения лишних разрядов.
В стандарте SQL типы REAL и DOUBLE PRECISION не допускают спецификаций точности. MySQL поддерживает вариацию синтаксиса с двумя числами в скобках следом за именем типа. Первое число представляет отображаемую ширину, а второе – количество разрядов после точки, которые должны сохраняться и отображаться. В качестве расширения стандарта SQL, MySQL распознает DOUBLE как синоним типа DOUBLE PRECISION. По контрасту с требованиями стандарта, что точность REAL должна быть меньше, чем DOUBLE PRECISION, MySQL реализует оба эти типа, как восьмибайтное число с плавающей точкой двойной точности (если только SQL-режим сервера не включает опцию REAL_AS_FLOAT).
Для достижения максимальной переносимости код, требующий сохранения приближенных числовых значений, должен использовать FLOAT и double precision без указания точности или количества разрядов после точки.
Когда в столбец записывается значение, выходящее за диапазон допустимых для данного типа, он принимает и сохраняет граничное значение допустимого диапазона.
Например, диапазон значений для столбцов типа INT составляет от -2147483648 до 2147483647. Если вы попытаетесь вставить значение -9999999999 в столбец типа INT, MySQL усечет его до нижней границы диапазона и сохранит -2147483648. Точно так же, если попытаться записать в этот столбец значение 9999999999, сохранено будет 2147483647.
Если столбец INT имеет атрибут UNSIGNED, размер диапазона значений такой же, но его границы смещаются к 0 и 4294967295. Если попытаться записать -9999999999 и 9999999999 B ЭТОТ столбец, будут сохранены значения 0 и 4294967295 соответственно.
О преобразовании, выполняемом при таком усечении значений, сообщается в виде предупреждений для операторов ALTER TABLE, LOAD DATA INFILE и многострочных операторов INSERT.