Типы данных

Тема дорожной карты · PostgreSQL

PostgreSQL предлагает одну из богатейших систем типов среди реляционных СУБД: десятки встроенных типов плюс возможность определять пользовательские типы с помощью CREATE TYPE. Основные числовые типы включают SMALLINT, INTEGER, BIGINT, NUMERIC(p,s), REAL и DOUBLE PRECISION; текстовые типы варьируются от неограниченного TEXT до CHAR(n) фиксированной ширины и переменного VARCHAR(n). Помимо стандартных SQL-типов, PostgreSQL поддерживает UUID, BOOLEAN, JSONB, ARRAY, HSTORE, типы сетевых адресов (INET, CIDR), геометрические типы и диапазонные типы (TSTZRANGE, INT4RANGE), открывающие мощные паттерны оптимизации запросов, недоступные в большинстве других реляционных СУБД. Выбор наиболее конкретного типа для столбца — например, TIMESTAMPTZ вместо TEXT для временны́х меток или BIGINT вместо TEXT для числовых идентификаторов — позволяет PostgreSQL обеспечивать целостность данных, использовать более компактное хранение и строить точные, быстрые индексы в рамках инфраструктуры индексирования.

Как это работает

Типы данных покрывает numeric (int, bigint, numeric, real, double), character (text, varchar, char — берите text, кроме реального лимита), date/time (timestamp, timestamptz — всегда tz-вариант), boolean, JSONB (запросимый JSON с GIN-индексами), массивы (int[], text[]), ranges (int4range, tsrange), UUID, network (inet, cidr), геометрические, кастомные через DOMAIN или CREATE TYPE. Postgres необычно богат — используйте типы, а не перегружайте text/JSONB.

Когда применять

Всегда timestamptz (timestamp with time zone) для меток времени — Postgres хранит UTC + конвертирует на показ. numeric(10,2) для денег, никогда real/float (округление). uuid для ID, видимых клиентам (нет утечки объёма vs integer); bigint — для внутренних high-volume последовательностей. JSONB (не JSON) — бинарный, индексируется, быстрее. Enum использовать аккуратно (тяжело мигрировать); lookup-таблица часто яснее.

Типичные ошибки

Ловушки Типы данных: timestamp (без tz) и тихое хранение локального (DST-ужас); varchar(255) "потому что MySQL" (в Postgres нет perf-выгоды — используйте text); JSON вместо JSONB (текст, медленней, без индексов); float для денег (копейка тут, копейка там — за годы). Прочтите справочник типов — окупается лучшими решениями по схеме.

Связанные понятия

Полезные ресурсы