Сегодня мы поговорим про числовые типы данных в PostgreSQL. Если вы когда-нибудь задумывались, как хранить число "42", финансовые расчеты или, может быть, миллисекунды, — вы попали по адресу. Давайте разбираться, какой тип подходит для каждой задачи, чтобы вы и ваши данные чувствовали себя комфортно.
Числовые типы данных в PostgreSQL делятся на три основные группы:
- Целые числа (
INTEGER): для хранения чисел без дробной части. Это привычные числа вроде 1, 42, -7. - Точные числа (
NUMERIC): для хранения чисел с фиксированным количеством знаков после запятой. Полезно для финансовых расчетов, где точность значит больше, чем жизнь. - Числа с плавающей запятой (
REAL): для хранения чисел, которые могут быть очень большими или невероятно маленькими. Они менее точны, чемNUMERIC, но подходят для научных вычислений.
Тип INTEGER
INTEGER — это тип данных для целых чисел. Подходит для случаев, когда нужно хранить числа без дробной части. PostgreSQL предоставляет целых три разновидности INTEGER, чтобы охватить разные диапазоны:
SMALLINT: маленький целочисленный тип. Диапазон: от -32,768 до 32,767.INTEGER(илиINT): стандартный целочисленный тип. Диапазон: от -2,147,483,648 до 2,147,483,647.BIGINT: для больших чисел. Диапазон: от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.
Представим, что у нас есть таблица students, в которой хранится информация о студентах: их имя, возраст и количество набранных кредитов (академических баллов):
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
Теперь выполним простой SQL-запрос, чтобы получить список студентов с их возрастом и количеством кредитов:
SELECT name, age, credits
FROM students;
Результат:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Когда использовать INTEGER?
- Хранение идентификаторов (
id, номера заказа). - Хранение количества чего-либо (например, количество товаров на складе, количество студентов).
Тип NUMERIC
NUMERIC — это тип данных для точных чисел с фиксированной запятой. Если вам нужно хранить что-то вроде 123.456, и ошибка в одном знаке после запятой будет стоить вам репутации (или денег), используйте NUMERIC.
Формат объявления: NUMERIC(precision, scale), где:
precision— общее количество цифр (включая те, что до и после запятой).scale— количество цифр после запятой.
Например, NUMERIC(6, 2) позволяет хранить числа с максимум 6 цифрами и 2 из них после запятой.
Создадим таблицу для учёта финансовых транзакций:
| id | description | amount |
|---|---|---|
| 1 | Оплата за обучение | 2345.67 |
| 2 | Ежемесячная стипендия | 500.00 |
| 3 | Сбор за лабораторию | 145.99 |
| 4 | Штраф за библиотеку | 12.75 |
| 5 | Регистрация на конференцию | 320.50 |
Теперь выведем список транзакций:
SELECT description, amount
FROM transactions;
Результат:
| description | amount |
|---|---|
| Оплата за обучение | 2345.67 |
| Ежемесячная стипендия | 500.00 |
| Сбор за лабораторию | 145.99 |
| Штраф за библиотеку | 12.75 |
| Регистрация на конференцию | 320.50 |
Когда использовать NUMERIC?
- Финансовые расчёты (стоимость товаров, зарплаты).
- Хранение точных измерений (вес, длина).
Таблица measurements
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
Теперь выведем значения:
SELECT mass, height
FROM measurements;
Результат:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Когда использовать REAL?
- Научные вычисления (масса атомов, расстояние до Луны).
- Моделирование данных, где погрешности допустимы.
Сравнение числовых типов: что когда использовать?
| Тип данных | Диапазон | Точность | Примеры применения |
|---|---|---|---|
SMALLINT |
-32,768 до 32,767 | Целые числа | Небольшие числа (возраст, рейтинги). |
INTEGER |
-2,147,483,648 до 2,147,483,647 | Целые числа | Идентификаторы, количества. |
BIGINT |
-9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 | Целые числа | Очень большие числа. |
NUMERIC |
Зависит от precision и scale |
Точные десятичные числа | Финансы, измерения. |
REAL |
Приблизительно 6 десятичных знаков | Плавающая точка | Примерные или научные данные. |
DOUBLE PRECISION |
Приблизительно 15 десятичных знаков | Высокоточная плавающая точка | Наука, исследования. |
Псевдонимы
В PostgreSQL у многих числовых типов есть алиасы (синонимы) — это альтернативные названия типов, которые ведут себя одинаково, но улучшают читаемость или совместимость с другими СУБД.
Вот краткое и понятное руководство по алиасам числовых типов в PostgreSQL:
Алиасы для целочисленных типов
| Алиас | Реальный тип | Размер | Диапазон |
|---|---|---|---|
INT |
INTEGER |
4 байта | −2,147,483,648 до 2,147,483,647 |
INT4 |
INTEGER |
4 байта | (устаревший алиас) |
SMALLINT |
SMALLINT |
2 байта | −32,768 до 32,767 |
INT2 |
SMALLINT |
2 байта | |
BIGINT |
BIGINT |
8 байт | −9 квинтиллионов до +9 квинтиллионов |
INT8 |
BIGINT |
8 байт |
Алиасы для точных чисел
| Алиас | Реальный тип | Назначение |
|---|---|---|
DEC |
NUMERIC |
Синоним по SQL-стандарту |
DECIMAL |
NUMERIC |
То же самое |
Алиасы для чисел с плавающей точкой
| Алиас | Реальный тип | Точность |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 знаков (по умолчанию) |
FLOAT(24) |
REAL |
~6 знаков |
FLOAT(53) |
DOUBLE PRECISION |
~15 знаков |
FLOAT8 |
DOUBLE PRECISION |
Устаревший алиас |
FLOAT4 |
REAL |
Устаревший алиас |
Типичные ошибки
Работая с числовыми типами, можно столкнуться с несколькими подводными камнями:
Выбор недостаточного типа данных. Если для возраста людей вы используете SMALLINT, ошибаетесь. Роботу из "Матрицы", у которого возраст миллионы лет, обидно.
Потеря данных при округлении. Используя REAL в финансовых расчетах, можно потерять копейки. А потом и доверие клиентов.
Сравнение разных типов. Если сравнить INTEGER и REAL, можно получить неожиданные результаты из-за особенностей представления чисел с плавающей точкой.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ