Skip to content

Типы данных PostgreSQL объяснённые

Все распространённые типы данных колонок PostgreSQL, сгруппированные по семействам: целые числа, десятичные дроби, текст, время, логические значения и UUID, JSON, сетевые адреса, составные типы и типы расширений. Каждая строка показывает, что хранит тип и когда его выбрать.

В PostgreSQL десятки типов, но повседневное проектирование схем обходится базовым набором. Повторяющиеся выборы: integer против numeric для чисел, varchar против text для строк (text обычно достаточно), timestamp против timestamptz (предпочитайте timestamptz для всего из реального мира) и json против jsonb (предпочитайте jsonb — он бинарный и индексируется). Выбирайте самый конкретный тип, который всё же подходит; база данных сама следит за его соблюдением.

Справочная таблица · 46 записи
46 of 46 rows
Целые числа
2-байтовое целое от -32768 до 32767.Редко; только когда нужно сэкономить место.
4-байтовое целое, примерно плюс/минус 2 миллиарда.Колонка по умолчанию для целых чисел.
8-байтовое целое, примерно плюс/минус 9 квинтиллионов.Очень большие счётчики или внешние идентификаторы.
Автоинкрементное 4-байтовое целое.Устаревшие автонумерованные ключи; с PG 10 рекомендуемая замена — GENERATED AS IDENTITY.
2- и 8-байтовые варианты serial.Автонумерация под колонку smallint или bigint.
Целое число, которое таблица генерирует за вас (GENERATED ALWAYS AS IDENTITY).Современный serial; стандарт SQL и защита от ручных вставок.
Десятичные и с плавающей точкой
Точные десятичные дроби с произвольной точностью.Деньги и всё, где ошибки округления недопустимы.
4-байтовое число с плавающей точкой одинарной точности.Приближённые научные значения, где точность не критична.
8-байтовое число с плавающей точкой двойной точности.Геоданные, статистика и значения признаков ML.
Денежная сумма с фиксированной локалью.Редко; numeric с кодом валюты на стороне приложения переносимее.
Текст
Текст фиксированной длины, дополняемый пробелами.Коды известной ширины; редко нужно.
Текст переменной длины с необязательным пределом.Ограниченные строки: имена пользователей, email.
Текст переменной длины без ограничения длины.Универсальная строковая колонка; без штрафа к производительности против varchar.
Время
Календарная дата без времени суток.Дни рождения и сроки.
Время суток, с часовым поясом или без.Ежедневные будильники или часы работы.
Дата и время без часового пояса.Устаревшие схемы; избегайте в новых проектах.
Дата и время, хранящиеся как UTC, показываются в зоне клиента.Вариант по умолчанию для любого реального момента; предпочитайте его timestamp.
Промежуток времени, например 2 дня или 3 часа.Длительности и арифметика дат.
Boolean, UUID и байты
Истина или ложь.Флаги и переключатели.
128-битный универсальный уникальный идентификатор.Непоследовательные ID, безопасные к показу (генерируйте в приложении или через gen_random_uuid).
Сырые двоичные байты.Блобы, изображения и непрозрачные данные; большие файлы храните в object storage.
Строки битов фиксированной или переменной длины.Упакованные флаги и поля протоколов; одиночное значение вкл/выкл — всё ещё boolean.
JSON и полуструктурированные данные
JSON, разобранный в бинарную индексируемую форму.Гибкие или вложенные данные; рекомендуемая JSON-колонка (поддерживает GIN-индексы).
JSON, сохранённый как исходный текст.Редко; только когда нужно сохранить порядок ключей или точные пробелы.
XML-текст.Устаревшие интеграции, требующие XML.
Скомпилированное выражение пути для навигации по данным JSON.Фильтрация внутри jsonb через jsonb_path_query и операторы SQL/JSON.
Сеть и поиск
Адрес хоста IPv4 или IPv6.Хранение IP клиентов или серверов.
Блок IP-сети, например 10.0.0.0/24.Правила файрвола и диапазоны подсетей.
MAC-адрес из 6 или 8 байт (EUI-64).Идентификаторы устройств и сетевых интерфейсов.
Предобработанный текст для полнотекстового поиска.Встроенный поиск Postgres, прежде чем тянуть отдельную поисковую систему.
Поисковые термины, объединённые операторами AND, OR и префикса.Половина запроса полнотекстового поиска, сопоставляется с tsvector через @@.
Позиция в журнале упреждающей записи, номер последовательности лога.Мониторинг отставания репликации и резервных копий.
Составные и продвинутые
Массив любого базового типа, напр. integer[].Списки простых значений; когда элементам нужны свои колонки — дочерняя таблица.
Одно значение из заданного вами фиксированного списка.Поля статуса со стабильным набором вариантов.
Собственный строчный тип из нескольких полей.Повторяющиеся группы полей, общие для нескольких таблиц.
Непрерывный диапазон между двумя границами.Расписания, ценовые диапазоны и версии, с операторами пересечения.
Базовый тип, обёрнутый в заданные вами ограничения.Многоразовые правила, например непустой email, действующие в каждой колонке, которая их использует.
Безымянная строка типизированных значений.Возврат функций PL/pgSQL и промежуточные результаты запросов.
Встроенные двумерные геометрические значения.Простая геометрия на плоскости; реальным локациям нужен PostGIS.
4-байтовый беззнаковый системный идентификатор объекта.Соединения системных каталогов; не для колонок приложения.
Внутренняя строка идентификатора до 63 символов.Запросы к каталогам; обычный text для всего, что видит пользователь.
Типы расширений
Пары ключ/значение из строк в одном значении (расширение).Плоские карты; сегодня jsonb покрывает это лучше.
Иерархический путь меток вроде news.tech.ai (расширение).Деревья с запросами предков и потомков.
Текст, сравниваемый без учёта регистра (расширение).Регистронезависимая уникальность, например email, без lower()-индекса.
Географические и геометрические объекты из расширения PostGIS.Запросы расстояния, вложенности и пространственных индексов.
Функции расширения, генерирующие значения UUID.Устаревшая генерация; с PG 13 встроена gen_random_uuid().