Условие
Какие числовые типы данных обычно поддерживаются в 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; -- trueFloat — приближённый, для денег недопустим: 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Подводные камни
NUMERICбез(p, s)— в PostgreSQL означает «произвольная точность», очень медленно. Указывайте размер.MONEY— зависит от локали (,vs.). ЛучшеNUMERIC.- Хранение фракций как INTEGER в копейках — частая практика для финансов:
345_67вместо345.67. Уточните соглашение в команде. - Сравнение FLOAT'ов через
=— никогда. ТолькоABS(a - b) < ε.
Эталонный ответ
Целочисленные: SMALLINT, INTEGER, BIGINT. Точные дробные: NUMERIC(p, s) / DECIMAL(p, s). Приближённые: REAL, DOUBLE PRECISION. Для денег и точных вычислений — только NUMERIC, никогда не FLOAT.