- 17 октября 2026
- 13 минут
- 4
Статью подготовили специалисты образовательного сервиса Zaochnik.
Числовой тип данных
Числовой тип данных — классификация типов данных, используемых для хранения чисел в системах управления базами данных SQL. Числовые типы отличаются по размеру, диапазону значений и точности представления. Каждый тип данных предназначен для оптимизации хранения и обработки чисел в зависимости от требований приложения.
Числовой тип данных — это тип данных, предназначенный для хранения целых и вещественных чисел с определёнными диапазонами значений и особенностями представления в памяти.
TINYINT
TINYINT — это целочисленный тип данных, занимающий 1 байт памяти. Он способен хранить целые числа в диапазоне от -128 до 127 (со знаком) или от 0 до 255 (без знака, с применением ключевого слова UNSIGNED). Параметр N указывает рекомендуемую ширину отображения, но не ограничивает фактическое значение.
Атрибут ZEROFILL дополняет числовое значение нулями слева до указанной ширины. В случае TINYINT(4) ZEROFILL число 5 будет отображено как 0005. Это визуальное изменение, не влияющее на хранимое значение или диапазон.
На практике параметр N не влияет на место в памяти или диапазон возможных значений, а служит для форматирования вывода в клиентском приложении или консоли. Применение UNSIGNED увеличивает верхнюю границу беззнаковых чисел вдвое, что существенно изменяет интерпретацию данных.
TINYINT UNSIGNED хранит числа от 0 до 255. TINYINT со знаком — от -128 до 127. Использование TINYINT(2) не ограничивает хранение трёхзначных значений. TINYINT(4) ZEROFILL визуализирует 5 как 0005.
SMALLINT
SMALLINT — целочисленный тип с размером 2 байта, способный хранить значения от -32 768 до 32 767 для со знаковым типом или от 0 до 65 535 для UNSIGNED. Поддерживается параметр M, указывающий рекомендуемую ширину отображения.
Объем памяти 2 байта сохраняет фиксированную, независимо от указания M или UNSIGNED. Параметр M влияет исключительно на форматирование при визуализации, не сужает и не расширяет диапазон значений.
При использовании SMALLINT(3) ZEROFILL числовое значение 7 будет выведено как 007, что удобно для унифицированного представления чисел с фиксированной длиной.
SMALLINT хранит числа от -32 768 до 32 767. SMALLINT UNSIGNED — от 0 до 65 535. SMALLINT(3) не ограничивает хранение четырёхзначных значений. SMALLINT(3) ZEROFILL визуализирует 7 как 007.
MEDIUMINT
MEDIUMINT занимает три байта памяти, что позволяет хранить целые числа от -8 388 608 до 8 388 607 со знаком или от 0 до 16 777 215 без знака (UNSIGNED).
Параметр M обозначает ширину отображения чисел на выводе, фактические допустимые значения не ограничены указанным числом символов. Атрибут ZEROFILL дополняет значение слева нулями до требуемой ширины для визуального форматирования.
Например, MEDIUMINT(4) ZEROFILL выведет число 8 как 0008, что не меняет хранимое число, а упрощает восприятие и парсинг отображаемых значений.
MEDIUMINT хранит числа от -8 388 608 до 8 388 607. MEDIUMINT UNSIGNED — от 0 до 16 777 215. MEDIUMINT(4) позволяет хранить значений длиной даже до 7 цифр. MEDIUMINT(4) ZEROFILL визуализирует 8 как 0008.
INT или INTEGER
INT или INTEGER — это 4-байтовый целочисленный тип данных с диапазоном значений от -2 147 483 648 до 2 147 483 647 для со знаковым типом и от 0 до 4 294 967 295 для UNSIGNED. Существенное увеличение памяти по сравнению с MEDIUMINT увеличивает емкость для хранения чисел.
Параметр N указывает рекомендуемую ширину отображения, не ограничивая реальный диапазон значений. Использование INT(5) не запрещает хранить числа с большим количеством цифр.
Атрибут ZEROFILL применим для вывода, заполняя ведущие позиции нулями. Например, при INT(3) ZEROFILL значение 42 будет отображено как 042.
INT хранит числа от -2 147 483 648 до 2 147 483 647. INT UNSIGNED — от 0 до 4 294 967 295. INT(5) не ограничивает количество знаков. INT(3) ZEROFILL визуализирует 42 как 042.
BIGINT
BIGINT — целочисленный тип данных, занимающий 8 байт памяти. Позволяет хранить числа со знаком в диапазоне от −9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 (это 2^63-1). Для UNSIGNED тип позволяет хранить значения от 0 до 18 446 744 073 709 551 615 (2^64-1).
Параметр N обозначает рекомендуемую ширину для визуального представления, без ограничения реально хранимых значений. Использование большого диапазона обусловлено необходимостью хранения уникальных идентификаторов, больших счетчиков или финансовых данных, требующих масштабирования.
Значение с ZEROFILL отображается дополненным нулями слева. Например, BIGINT(3) ZEROFILL отобразит число 9 как 009. Этот атрибут не влияет на физическое хранилище.
BIGINT хранит значения от −2^63 до 2^63-1. BIGINT UNSIGNED — от 0 до 2^64-1. BIGINT(5) не ограничивает действительный размер числа. BIGINT(3) ZEROFILL визуализирует 9 как 009.
BOOL и BOOLEAN
Типы BOOL и BOOLEAN используются для хранения булевых значений. Эти типы занимают 1 байт памяти и принимают только два значения: 0 (false) или 1 (true).
В ряде SQL-систем BOOL и BOOLEAN реализуются как псевдонимы INT с ограничением значений. При хранении занимают фиксированное пространство, что упрощает индексацию и оптимизацию запросов.
Несмотря на использование одного байта, часто для эффективности возможна упаковка нескольких булевых значений в менее объемные блоки памяти на уровне СУБД, что зависит от реализации.
DECIMAL, DEC и NUMERIC
Типы DECIMAL, DEC и NUMERIC предназначены для точного хранения чисел с фиксированной запятой. Они подходят для финансовых данных, где важна высокая точность без округлений, свойственных плавающей точке.
Параметр N определяет общее количество цифр, доступных в числе, включая целые и дробные. Максимально возможное значение N составляет 64. Параметр S задает количество знаков после десятичной точки, не превышающее 30.
Объем памяти, занимаемый такими числами, равен N+2 байтам. Диапазон значений зависит от указанных параметров, что позволяет ограничивать допустимый числовой интервал.
DECIMAL(4,2) хранит значения от -99,99 до 99,99 с двумя знаками после запятой. Такой тип идеален для денежных сумм, где точность важнее диапазона.
FLOAT
FLOAT — тип данных с плавающей запятой, обычно занимает 4 байта. Диапазон значений составляет приблизительно от ±1.175494351 × 10^-38 до ±3.402823466 × 10^38. Он реализуется по стандарту IEEE 754 для 32-битных чисел.
Параметры N и S задают рекомендуемое количество цифр в числе и количество цифр после запятой. В некоторых реализациях эти параметры имеют ограниченное влияние на хранение и скорее используются для форматирования или совместимости.
Ключевое слово UNSIGNED запрещает отрицательные значения, но диапазон по модулю остается тем же. Основное отличие FLOAT — приближённое представление чисел, что может привести к ошибкам округления при операциях.
DOUBLE
DOUBLE — 8-байтовый тип с плавающей запятой с двойной точностью. Диапазон значений простирается от ±2.2250738585072015 × 10^-308 до ±1.7976931348623157 × 10^308.
DOUBLE реализует стандарт IEEE 754 для 64-битных чисел, что обеспечивает повышенную точность и меньшее накопление ошибок округления по сравнению с FLOAT.
Параметры N и S, аналогично FLOAT, используются для совместимости и оформления, физический формат хранения фиксирован и не зависит от них.
Увеличение диапазона и точности числового типа напрямую увеличивает объем памяти, выделяемый под хранение. Неправильный выбор типа может привести к избыточному использованию ресурсов или потере точности.
Сравнение числовых типов данных
Ниже приведена таблица с основными параметрами целочисленных и числовых типов SQL. Она отражает объем памяти, диапазоны значений и примечания по применению.
| Тип | Размер памяти (байт) | Диапазон (со знаком) | Диапазон (UNSIGNED) | Особенности |
|---|---|---|---|---|
| TINYINT | 1 | -128 ... 127 | 0 ... 255 | Параметр N влияет на формат вывода |
| SMALLINT | 2 | -32 768 ... 32 767 | 0 ... 65 535 | ZEROFILL заполняет нулями слева |
| MEDIUMINT | 3 | -8 388 608 ... 8 388 607 | 0 ... 16 777 215 | Большой диапазон при среднем размере |
| INT / INTEGER | 4 | -2 147 483 648 ... 2 147 483 647 | 0 ... 4 294 967 295 | Часто используется для идентификаторов |
| BIGINT | 8 | -2^63 ... 2^63-1 | 0 ... 2^64-1 | Для очень больших чисел |
| BOOL / BOOLEAN | 1 | 0 или 1 | 0 или 1 | Хранение булевых значений |
| DECIMAL (N,S) | N+2 | Зависит от N и S | Зависит от N и S | Прецизионное хранение |
| FLOAT | 4 | ±1.175494351×10^-38 ... ±3.402823466×10^38 | То же | Плавающая точка, возможны ошибки округления |
| DOUBLE | 8 | ±2.2250738585072015×10^-308 ... ±1.7976931348623157×10^308 | То же | Двойная точность, точнее FLOAT |
В таблице указаны стандартные диапазоны для широко используемых СУБД, таких как MySQL. Для других систем значения могут незначительно отличаться, но принцип остается тем же.
Типичные ошибки при работе с числовыми типами данных
Неправильный выбор типа данных может привести к потере данных или неэффективному использованию памяти. Например, использование INT вместо TINYINT для хранения возраста обычно избыточно и приводит к увеличению размера таблицы.
Отсутствие учета знаковости при подборе UNSIGNED или SIGNED может вызвать ошибки в логике приложения. Присвоение отрицательных значений UNSIGNED типу приведет к ошибкам выполнения.
Применение параметра N как ограничения диапазона — распространённая ошибка. Этот параметр влияет только на визуальное отображение, а не на хранение или максимальное значение.
Использование FLOAT и DOUBLE для точных денежных вычислений часто приводит к накоплению ошибок округления. Для таких целей рекомендуется применять типы с фиксированной точкой, например, DECIMAL.
Граничные условия применения
Максимальный объем памяти выделяется для BIGINT и DOUBLE, соответственно 8 байт. При больших объемах данных это влияет на производительность и расход дискового пространства.
Параметры N и S в DECIMAL ограничиваются 64 и 30 соответственно. Значения, выходящие за пределы этих ограничений, не поддерживаются.
Диапазоны SIGNED и UNSIGNED сопоставимы по объему, но отличаются логикой хранения, что важно учитывать при проектировании базы данных.
Матрица условий выбора числового типа данных
В таблице ниже изложены рекомендации по выбору типов данных с учетом требований к объему, диапазону и точности.
Основные критерии выбора числового типа данных:
- Если задача — хранение небольших целых чисел без отрицательных значений до 255 — применить TINYINT UNSIGNED.
- Для диапазона целых значений до ≈65 тысяч использовать SMALLINT UNSIGNED.
- Если требуется диапазон от сотен тысяч до миллионов, выбирать MEDIUMINT UNSIGNED.
- Для таблиц с большими идентификаторами и счетчиками подходит INT или BIGINT в зависимости от ожидаемого максимума.
- Для булевых значений подходит BOOL или BOOLEAN, занимающие 1 байт.
- Для денежных или точных дробных данных применять DECIMAL с нужными N и S.
- Для приблизительных вычислений с обширным диапазоном — FLOAT или DOUBLE, учитывая возможные ошибки округления.
Неправильный выбор приводит к росту используемой памяти, ухудшению производительности запросов и возможным ошибкам в логике обработки чисел.