Типы данных
Тип столбца определяет представление значений и преобразования, необходимые при записи. Некоторые названия 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 не заменяет прикладной тип столбца.
External types
Заголовок раздела «External types»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. Некорректная шестнадцатеричная запись отклоняется.
JSON и векторы
Заголовок раздела «JSON и векторы»JSONB является псевдонимом JSON; название не означает поддержку операторов PostgreSQL JSONB или его дискового формата. Аналогично, объявление VECTOR само по себе не определяет семантику всех векторных функций и индексов.
VECTOR(n) сохраняет размерность от 1 до 65535. Размерности вне диапазона
отклоняются. Контракты индексов и функций отделены от распознавания имени типа
и должны проверяться для используемых приложением операций.
Преобразования и ограничения
Заголовок раздела «Преобразования и ограничения»Для явного преобразования используйте CAST(expression AS type).
Запись значения в типизированный столбец тоже может требовать преобразования.
Недопустимое преобразование не следует считать отсутствующим значением:
обрабатывайте ошибку операции. NOT NULL, ключи и другие ограничения
задаются отдельно от выбора типа.
Далее читайте выражения: арифметику, сравнения и NULL.