Gymterview
junior

Какие основные типы данных поддерживает PostgreSQL?

PostgreSQL обладает одной из самых богатых систем типов данных среди всех СУБД, включая числовые, строковые, временные, а также специализированные типы вроде UUID, JSONB и массивов.

Числовые типы

Тип Размер Диапазон
smallint 2 байта -32768 до +32767
integer 4 байта -2147483648 до +2147483647
bigint 8 байт -9223372036854775808 до +9223372036854775807
decimal/numeric переменный до 131072 цифр до точки, до 16383 после
real 4 байта 6 значащих цифр
double precision 8 байт 15 значащих цифр

Для финансовых расчётов всегда используют numeric — он обеспечивает точные вычисления без ошибок округления, в отличие от real и double precision.

Символьные типы

  • char(n) — строка фиксированной длины, дополняется пробелами
  • varchar(n) — строка переменной длины с ограничением
  • text — строка произвольной длины (без ограничения)

В PostgreSQL varchar без указания длины и text абсолютно идентичны по производительности. Рекомендуется использовать text, а ограничения длины делать через CHECK-constraints.

Дата и время

  • date — только дата (4 байта)
  • time — только время (8 байт)
  • timestamp — дата и время без часового пояса
  • timestamptz (timestamp with time zone) — дата и время с часовым поясом
  • interval — интервал времени
Пример
-- Рекомендуется всегда использовать timestamptz
CREATE TABLE transactions (
    id bigserial PRIMARY KEY,
    amount numeric(15, 2) NOT NULL,
    created_at timestamptz DEFAULT now()
);

Прочие типы

  • booleantrue, false, null
  • uuid — 128-битный универсальный уникальный идентификатор; для генерации используется gen_random_uuid() (с PostgreSQL 13) или расширение uuid-ossp
  • json / jsonb — хранение JSON-данных (текстовое и бинарное представление)
  • Массивы — любой тип данных может быть массивом: integer[], text[]
  • Serial типы — serial, bigserial, smallserial (автоинкрементные псевдотипы)

Начиная с PostgreSQL 10 рекомендуется использовать стандартный GENERATED ALWAYS AS IDENTITY вместо serial.

Пример
CREATE TABLE clients (
    id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name text NOT NULL
);

На собеседовании: ключевые моменты — numeric для денег (не double), timestamptz вместо timestamp, text вместо varchar, и GENERATED ALWAYS AS IDENTITY вместо serial. Это показывает знание лучших практик, а не просто перечисление типов.