Обзор числовых типов данных
Существует ряд числовых типов данных:
- TINYINT
- BOOLEAN - Синоним для TINYINT(1)
- INT1 - Синоним для TINYINT
- SMALLINT
- INT2 - Синоним для SMALLINT
- MEDIUMINT
- INT3 - Синоним для MEDIUMINT
- INT, INTEGER
- INT4 - Синоним для INT
- BIGINT
- INT8 - Синоним для BIGINT
- DECIMAL, DEC, NUMERIC, FIXED
- FLOAT
- DOUBLE, DOUBLE PRECISION, REAL
- BIT
Для получения подробной информации см. соответствующие статьи.
SIGNED, UNSIGNED и ZEROFILL
Большинство числовых типов могут быть определены как SIGNED, UNSIGNED или ZEROFILL, например:
TINYINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]
Если SIGNED, или нет атрибута, указано, часть числового типа будет зарезервирована для знака (плюс или минус). Например, TINYINT SIGNED может принимать значения от -128 до 127.
Если UNSIGNED указано, никакая часть числового типа не зарезервирована для знака, поэтому диапазон для целочисленных типов может быть шире. Например, TINYINT UNSIGNED может принимать значения от 0 до 255. Типы с плавающей запятой и фиксированной запятой также могут быть UNSIGNED, но это только предотвращает хранение отрицательных значений и не изменяет диапазон.
Если ZEROFILL указано, столбец будет установлен в UNSIGNED, а пробелы, используемые по умолчанию для заполнения поля, заменяются нулями. ZEROFILL игнорируется в выражениях или как часть UNION. ZEROFILL — это нестандартное расширение MySQL и MariaDB.
Обратите внимание, что хотя предпочтительный синтаксис указывает, что атрибуты являются исключительными, может быть указано более одного атрибута.
До MariaDB 10.2.7 (MDEV-8659), любая комбинация атрибутов могла использоваться в любом порядке с дубликатами. В этом случае:
- наличие
ZEROFILLделает столбецUNSIGNED ZEROFILL. - наличие
UNSIGNEDделает столбецUNSIGNED.
Начиная с MariaDB 10.2.8, поддерживаются только следующие комбинации:
-
SIGNED -
UNSIGNED -
ZEROFILL -
UNSIGNED ZEROFILL -
ZEROFILL UNSIGNED
Последние две должны быть заменены просто на ZEROFILL, но все еще принимаются парсером.
Примеры
CREATE TABLE zf ( i1 TINYINT SIGNED, i2 TINYINT UNSIGNED, i3 TINYINT ZEROFILL ); INSERT INTO zf VALUES (2,2,2); SELECT * FROM zf; +------+------+------+ | i1 | i2 | i3 | +------+------+------+ | 2 | 2 | 002 | +------+------+------+
Диапазон
При попытке добавить значение, выходящее за допустимый диапазон для числового типа, MariaDB будет реагировать в зависимости от настройки строгого режима SQL_MODE.
Если strict_mode установлен (по умолчанию начиная с MariaDB 10.2.4), MariaDB вернёт ошибку.
Если strict_mode не установлен (по умолчанию до MariaDB 10.2.3), MariaDB скорректирует число для соответствия полю, вернув предупреждение.
Примеры
При установленном strict_mode:
SHOW VARIABLES LIKE 'sql_mode'; +---------------+-------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------------------------------------------------------+ | sql_mode | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +---------------+-------------------------------------------------------------------------------------------+ CREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED); INSERT INTO ranges VALUES (257,257,257); ERROR 1264 (22003): Out of range value for column 'i1' at row 1 SELECT * FROM ranges; Empty set (0.10 sec)
При отсутствии strict_mode:
SHOW VARIABLES LIKE 'sql_mode%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_mode | | +---------------+-------+ CREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED); INSERT INTO ranges VALUES (257,257,257); Query OK, 1 row affected, 2 warnings (0.00 sec) SHOW WARNINGS; +---------+------+---------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------+ | Warning | 1264 | Out of range value for column 'i1' at row 1 | | Warning | 1264 | Out of range value for column 'i3' at row 1 | +---------+------+---------------------------------------------+ 2 rows in set (0.00 sec) SELECT * FROM ranges; +------+------+------+ | i1 | i2 | i3 | +------+------+------+ | 127 | 257 | 255 | +------+------+------+
Автоинкремент
Атрибут AUTO_INCREMENT может быть использован для генерации уникального идентификатора для новых строк. Более подробная информация доступна в разделе автоинкремента.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/numeric-data-type-overview/