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

Типы данных

Тип столбца определяет представление значений и преобразования, необходимые при записи. Разные названия SQL не всегда обозначают разные типы: некоторые имена ниже соответствуют одному внутреннему представлению.

Тип Допустимые псевдонимы Представление
INTEGER INT, BIGINT, SMALLINT, TINYINT Знаковое 64-битное целое
FLOAT DOUBLE, REAL 64-битное число с плавающей точкой
DECIMAL NUMERIC Точное десятичное число с precision и scale
TEXT VARCHAR, CHAR, STRING, CLOB Текст UTF-8
BOOLEAN BOOL Истина или ложь
TIMESTAMP DATETIME, TIME Временная метка, не отдельный тип времени суток
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 17 вместе с type object ID и codec revision. Они не заменяются на BYTES, а generic ORM не декодирует их без plugin-aware adapter. В Rust SDK 1.2 также нет 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 является приближённым представлением и не равнозначен точному десятичному числу.

Используйте TEXT или текстовый псевдоним без параметров, например VARCHAR. Модификаторы длины VARCHAR(255) и CHAR(10) в этой версии отклоняются, а не принимаются как молча игнорируемые ограничения. Это правило также отклоняет модификаторы других типов, кроме 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. Точное хранение не обещает, что любое арифметическое выражение со смешанными типами повторяет правила округления другой СУБД. Для точных значений используйте типизированные параметры клиента и проверяйте контракт преобразования и арифметики нужной операции.

DATE представляет календарный день; TIMESTAMP, DATETIME и TIME используют одно представление временной метки. Не воспринимайте TIME как отдельный SQL-тип только для времени суток. 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.