JavaRush /Курсы /SQL SELF /Числовые типы данных: INTEGER, NUMER...

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

SQL SELF
15 уровень , 1 лекция
Открыта

Сегодня мы поговорим про числовые типы данных в PostgreSQL. Если вы когда-нибудь задумывались, как хранить число "42", финансовые расчеты или, может быть, миллисекунды, — вы попали по адресу. Давайте разбираться, какой тип подходит для каждой задачи, чтобы вы и ваши данные чувствовали себя комфортно.

Числовые типы данных в PostgreSQL делятся на три основные группы:

  1. Целые числа (INTEGER): для хранения чисел без дробной части. Это привычные числа вроде 1, 42, -7.
  2. Точные числа (NUMERIC): для хранения чисел с фиксированным количеством знаков после запятой. Полезно для финансовых расчетов, где точность значит больше, чем жизнь.
  3. Числа с плавающей запятой (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, можно получить неожиданные результаты из-за особенностей представления чисел с плавающей точкой.

2
Задача
SQL SELF, 15 уровень, 1 лекция
Недоступна
Округление температуры
Округление температуры
2
Задача
SQL SELF, 15 уровень, 1 лекция
Недоступна
Преобразование единиц измерения (км/ч → м/с)
Преобразование единиц измерения (км/ч → м/с)
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 11
8 сентября 2025
Во второй задаче всратому валидатору не понравился алиас DEC, потребовал именно NUMERIC. Хотя в первой задаче вел себя приличнее.