Перейти к содержимому

Типы данных

Тип столбца определяет представление значений и преобразования, необходимые при записи. Некоторые названия SQL являются псевдонимами, а другие типы используют общий физический кодек, сохраняя разные SQL- и catalog-идентичности.

Тип Допустимые псевдонимы Представление
INTEGER INT, BIGINT, SMALLINT, TINYINT Знаковое 64-битное целое
FLOAT REAL 64-битное число с плавающей точкой
DOUBLE PRECISION DOUBLE 64-битное число с плавающей точкой с отдельной SQL- и catalog-идентичностью
DECIMAL NUMERIC Точное десятичное число с precision и scale
TEXT VARCHAR, CHAR, STRING, CLOB Текст UTF-8 переменной длины с необязательным ограничением числа символов
BOOLEAN BOOL Истина или ложь
TIMESTAMPTZ TIMESTAMP WITH TIME ZONE Абсолютный момент, нормализованный в наносекунды UTC
TIMESTAMP TIMESTAMP WITHOUT TIME ZONE, DATETIME Календарные дата и время без часового пояса
TIME TIME WITHOUT TIME ZONE Время суток без даты и часового пояса
DATE Календарная дата
UUID 16-байтовый идентификатор
BYTES BLOB, BINARY, VARBINARY Произвольные байты
JSON JSONB Значение JSON
VECTOR Векторное значение

NULL обозначает отсутствие значения. Столбец, допускающий NULL, может содержать его независимо от объявленного типа. NULL не заменяет прикладной тип столбца.

Trusted native extension может добавить catalog-bound scalar type командой CREATE TYPE ... FROM EXTENSION. Package descriptor задает stable object ID, fixed или variable storage shape, canonical codec revision, maximum payload и optional semantics equality, hash и ordering. SQL name является schema alias этой identity и может быть переименован без изменения stored bytes.

External values передаются через protocol 18 вместе с type object ID и codec revision. Они не заменяются на BYTES, а generic ORM не декодирует их без plugin-aware adapter. В Rust SDK 1.2.25 также нет generic SQL literal input/output callback, поэтому value обычно создается native function или typed client adapter. См. «Команды native extensions» и «Разработку native extensions».

SMALLINT и TINYINT не задают 16-битные или 8-битные границы. Это псевдонимы INTEGER. Если приложению нужен более узкий диапазон, задайте ограничение.

CREATE TABLE typed_values (id SMALLINT, label TEXT, active BOOL);
INSERT INTO typed_values VALUES (100000, 'ready', TRUE);
SELECT id, label, active FROM typed_values;

Строка содержит 100000, ready и true. Диапазон INTEGER: от -9223372036854775808 до 9223372036854775807. FLOAT и DOUBLE PRECISION являются приближёнными представлениями и не равнозначны точному десятичному числу. DOUBLE и DOUBLE PRECISION сохраняют SQL- и catalog-идентичность DOUBLE PRECISION, а FLOAT и REAL - идентичность FLOAT. Оба типа используют физическое представление f64.

TEXT, VARCHAR, CHAR, STRING и CLOB без параметров являются псевдонимами неограниченного текста. TEXT(n), VARCHAR(n) и CHAR(n) задают положительный максимум из n скалярных значений Unicode. Ограничение считает символы, а не байты UTF-8, не меняет хранение переменной длины и не дополняет CHAR(n) пробелами. В выводе схемы все ограниченные варианты канонизируются как TEXT(n).

CREATE TABLE labels (
id INTEGER PRIMARY KEY,
code TEXT(2) NOT NULL,
title VARCHAR(5) NOT NULL,
marker CHAR(1)
);
INSERT INTO labels VALUES (1, 'AB', 'ready', 'x');
SELECT code, title, marker FROM labels;

Нулевые, некорректные и выходящие за диапазон ограничения отклоняются. DEFAULT, INSERT, UPDATE и любая другая запись также завершаются ошибкой, если значение длиннее объявленного предела. Для остальных скалярных типов параметры по-прежнему не поддерживаются, кроме TEXT-псевдонимов, DECIMAL/NUMERIC и VECTOR.

DECIMAL(p,s) задаёт общую точность и число дробных разрядов. Точность находится в диапазоне от 1 до 38, а число дробных разрядов не превышает точность. Для DECIMAL(p) число дробных разрядов равно нулю. DECIMAL без параметров допустим без объявленного ограничения precision/scale.

CREATE TABLE prices (amount DECIMAL(6,2));
INSERT INTO prices VALUES (12.34);
SELECT CAST(amount AS TEXT) AS amount FROM prices;

Результат равен 12.34. Точное хранение не обещает, что любое арифметическое выражение со смешанными типами повторяет правила округления другой СУБД. Для точных значений используйте типизированные параметры клиента и проверяйте контракт преобразования и арифметики нужной операции.

Используйте TIMESTAMPTZ для события, произошедшего в один абсолютный момент. Смещение входного значения применяется, после чего момент нормализуется в UTC. TIMESTAMP предназначен для календарных даты и времени без часового пояса, например для указанного в расписании местного времени открытия. DATETIME является псевдонимом этого календарного типа. TIME хранит время суток без даты. Календарный TIMESTAMP отклоняет входное значение со смещением UTC вместо того, чтобы молча отбросить его.

SELECT CAST(TIMESTAMPTZ '2026-09-11T10:20:30.123456789+07:00' AS TEXT) AS instant,
TYPEOF(TIMESTAMPTZ '2026-09-11T10:20:30.123456789+07:00') AS instant_type,
CAST(TIMESTAMP '2026-09-11 10:20:30.123456789' AS TEXT) AS civil,
TYPEOF(TIMESTAMP '2026-09-11 10:20:30.123456789') AS civil_type,
CAST(TIME '23:59:59.999999999' AS TEXT) AS clock,
TYPEOF(TIME '23:59:59.999999999') AS clock_type,
TYPEOF(CURRENT_TIMESTAMP) AS current_type;

Запрос возвращает нормализованный момент 2026-09-11T03:20:30.123456789+00:00, неизменённое календарное значение и время суток с типами TIMESTAMPTZ, TIMESTAMP и TIME соответственно. Последний столбец подтверждает, что CURRENT_TIMESTAMP имеет тип TIMESTAMPTZ.

CIVIL_TO_TIMESTAMPTZ(value, zone) преобразует календарное значение с явно заданным часовым поясом IANA или фиксированным смещением. TIMESTAMPTZ_TO_CIVIL(value, zone) выполняет обратное преобразование. Неоднозначное и несуществующее локальное время при переходах летнего времени отклоняется. TCP-соединения начинают работу в UTC; SET TIME ZONE и SHOW TIME ZONE управляют разбором и выводом TIMESTAMPTZ без явного смещения в пределах соединения. CURRENT_TIMESTAMP возвращает TIMESTAMPTZ.

DATE представляет календарный день. UUID имеет типизированное представление, а не является произвольным текстовым столбцом. BYTES хранит данные без требования корректного UTF-8.

SELECT CAST('2026-09-08' AS DATE) AS day,
CAST('01940000-0020-7000-8000-000000000001' AS UUID) AS id,
FROM_HEX('00ff7f') AS bytes;

Возвращаются дата, указанный UUID и три байта 00 ff 7f. Отображение зависит от клиента. В JSON-выводе CLI дата содержит days_since_unix_epoch, а BYTES содержит raw_hex: не каждая типизированная ячейка использует скалярное поле value. Некорректная шестнадцатеричная запись отклоняется.

JSONB является псевдонимом JSON; название не означает поддержку операторов PostgreSQL JSONB или его дискового формата. Аналогично, объявление VECTOR само по себе не определяет семантику всех векторных функций и индексов.

VECTOR(n) сохраняет размерность от 1 до 65535. Размерности вне диапазона отклоняются. Контракты индексов и функций отделены от распознавания имени типа и должны проверяться для используемых приложением операций.

Для явного преобразования используйте CAST(expression AS type). Запись значения в типизированный столбец тоже может требовать преобразования. Недопустимое преобразование не следует считать отсутствующим значением: обрабатывайте ошибку операции. NOT NULL, ключи и другие ограничения задаются отдельно от выбора типа.

Далее читайте выражения: арифметику, сравнения и NULL.