Собесов

Числовые типы данных в SQL: INTEGER, NUMERIC, DECIMAL, FLOAT

SQLТипы данныхЛёгкаяJunior

Условие

Какие числовые типы данных обычно поддерживаются в SQL? Когда какой выбирать?

Решение

Целочисленные

Тип Диапазон Размер
SMALLINT −32 768 до 32 767 2 байта
INTEGER / INT ±2.1·10⁹ 4 байта
BIGINT ±9.2·10¹⁸ 8 байт
SERIAL (PG) INT с автоинкрементом 4 байта
BIGSERIAL (PG) BIGINT с автоинкрементом 8 байт

Дробные точные

Тип Описание
NUMERIC(p, s) / DECIMAL(p, s) Точное представление; p — всего цифр, s — после запятой. Без потерь
MONEY Денежный тип в некоторых СУБД. Избегать — путаница с локалью

Дробные приближённые (плавающая точка)

Тип Точность Размер
REAL / FLOAT4 ~6 знаков 4 байта
DOUBLE PRECISION / FLOAT8 ~15 знаков 8 байт

Когда что выбирать

Сценарий Тип
ID, счётчики BIGINT (с запасом на рост)
Деньги, проценты NUMERIC(19, 4) или (19, 6)
Доли, рейтинги, ML-фичи DOUBLE PRECISION
Массивы координат, тензоры DOUBLE PRECISION или REAL

Почему NUMERIC для денег, а не FLOAT

SELECT 0.1 + 0.2 = 0.3 AS dp_eq;        -- false! 0.30000000000000004
SELECT 0.1::NUMERIC + 0.2::NUMERIC = 0.3::NUMERIC; -- true

Float — приближённый, для денег недопустим: 2.5 ₽ + 2.5 ₽ может стать 4.999....

INTEGER vs BIGINT

Современная рекомендация — для PK почти всегда BIGINT. INTEGER имеет лимит 2.1 млрд: для маленькой таблицы достаточно, но если попадёте на лимит, миграция на BIGINT — боль.

Переполнение

Что произойдёт при превышении диапазона: ошибка (integer out of range). Молчаливо не обрезается.

SELECT 32768::SMALLINT;  -- error: smallint out of range

Подводные камни

  1. NUMERIC без (p, s) — в PostgreSQL означает «произвольная точность», очень медленно. Указывайте размер.
  2. MONEY — зависит от локали (, vs .). Лучше NUMERIC.
  3. Хранение фракций как INTEGER в копейках — частая практика для финансов: 345_67 вместо 345.67. Уточните соглашение в команде.
  4. Сравнение FLOAT'ов через = — никогда. Только ABS(a - b) < ε.

Эталонный ответ

Целочисленные: SMALLINT, INTEGER, BIGINT. Точные дробные: NUMERIC(p, s) / DECIMAL(p, s). Приближённые: REAL, DOUBLE PRECISION. Для денег и точных вычислений — только NUMERIC, никогда не FLOAT.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти