# Типы данных

Каждый тип в Picodata в дополнение к поддерживаемым значениям позволяет хранить `NULL`
(`UNKNOWN` в терминологии троичной логики).

Типы данных в Picodata делятся на две категории:

- **Базовые типы** — фундаментальные типы, которые можно использовать везде (в определениях таблиц, определениях процедур, кастах и т.д.)

- **Доменные типы** — специализированные типы, построенные на основе базовых с добавлением ограничений

    - На данный момент поддерживаются только в DDL (определение таблиц)

    - В DQL/DML (запросы и модификация данных) доменные типы не разрешены


## Базовые типы {: #unrestricted_types }

На данный момент в Picodata поддерживаются следующие базовые типы:

### BOOLEAN {: #boolean }

Логический тип данных, поддерживаемые значения: `FALSE` и `TRUE`. По правилам сравнения
`FALSE` меньше `TRUE`.

**Синонимы**: BOOLEAN, BOOL.

### DECIMAL {: #decimal }

Числа с фиксированной запятой, содержащие до 38 цифр и принимающие значения в диапазоне
от `-99999999999999999999999999999999999999` до `99999999999999999999999999999999999999`;

!!! note "Примечание"
    Тип `NUMERIC`, поддерживаемый в клиентах PostgreSQL,
    будет приведен в Picodata к типу `DECIMAL`. Ограничения PostgreSQL
    на количество знаков в целой и дробной части будут проигнорированы.

### DOUBLE {: #double }

Числа с плавающей запятой стандарта IEEE 754, принимающие значения в диапазоне от
`-1.79769E308` до `1.79769E308`.
Помимо стандартной записи дробного числа (например, `0.5`) поддерживается и
экспоненциальная форма (например, `5E-1`).

### INTEGER {: #integer }

Целые числа в диапазоне от `−9223372036854775808` до `+9223372036854775807`.

**Синонимы**: INTEGER, INT.

!!! note "Примечание"
    Типы `INT2`, `INT4`, `INT8`, `SMALLINT`, `BIGINT`, поддерживаемые в
    клиентах PostgreSQL, будут приведены в Picodata к типу `INT`.

### JSON {: #json }

Тип JSON предназначен для хранения данных JSON (JavaScript Object Notation, Запись объекта JavaScript) согласно стандарту [RFC-7159].

!!! note "Примечание"
    На данный момент тип JSON для колонки можно
    указать только при создании таблицы. Операции DML/DQL с типом JSON
    пока не поддерживаются.

### TEXT {: #text }

Текстовый тип данных. Позволяет хранить текстовую строку переменной длины. Максимальная
длина составляет `2,147,483,647` байт.

**Синонимы**: TEXT, STRING, VARCHAR.

### UUID {: #uuid }

Тип универсального уникального идентификатора. Позволяет хранить 32 шестнадцатеричные цифры.
Текстовое представление `UUID` — это строка, разделенная дефисами на пять групп в формате
`8-4-4-4-12` (например, `102be9bf-215f-4180-b4c9-cc11983e988d`).

!!! note "Примечание"
    На данный момент поддерживается только 4-я версия UUID.

### DATETIME {: #datetime }

Тип данных для хранения даты и времени. Диапазон корректных значений
даты и времени должен находиться между `-9999-12-31 23:59:59` и
`9999-12-31 23:59:59`. Данный тип соответствует международному стандарту
формата даты и времени (ISO 8601) в части [RFC-3339]. Для
указания часового пояса следует использовать смещение от [-12 до +14]
относительно UTC. Допускается несколько вариантов записи, в том числе с
указанием минут (от 0 до 59). Примеры допустимых значений:

- `2025-10-18 02:59:59Z` (нет смещения, Z означает зону UTC)
- `2025-10-18 02:59:59 +1` (смещение на 1 час к востоку)
- `2025-10-18 02:59:59 -01:00` (смещение на 1 час к западу)
- `2025-10-18 02:59:59 +1245` (смещение на 12 часов 45 минут к востоку)

При некорректном вводе смещения, оно будет отсечено; значение времени
при этом сохранится для зоны UTC.

[-12 до +14]: https://ru.wikipedia.org/wiki/Всемирное_координированное_время#Использование
[RFC-3339]: https://datatracker.ietf.org/doc/html/rfc3339
[RFC-7159]: https://datatracker.ietf.org/doc/html/rfc7159

## Доменные типы {: #domain_types }

Следующие типы могут использоваться только при определении колонок таблиц:

### UNSIGNED {: #unsigned }

Тип целого беззнакового числа в диапазоне от `0` до `+9223372036854775807`. Другими словами — базовый тип **INTEGER** и ограничение >= 0.

См. также:

- [Совместимость с ANSI SQL](ansi_sql.md)
