Примитивные типы данных

Термины «простые», «примитивные» и «элементарные» типы данных используются как синонимы.

Числовые типы

Тип Описание Примечания
Bool Логическое значение.
Int8 Целое число со знаком.
Допустимые значения: от –27 до 27–1.
Int16 Целое число со знаком.
Допустимые значения: от –215 до 215–1.
Int32 Целое число со знаком.
Допустимые значения: от –231 до 231–1.
Int64 Целое число со знаком.
Допустимые значения: от –263 до 263–1.
Uint8 Беззнаковое целое число.
Допустимые значения: от 0 до 28–1.
Uint16 Беззнаковое целое число.
Допустимые значения: от 0 до 216–1.
Uint32 Беззнаковое целое число.
Допустимые значения: от 0 до 232–1.
Uint64 Беззнаковое целое число.
Допустимые значения: от 0 до 264–1.
Float Вещественное число с переменной точностью размером 4 байта. Не может быть использован в первичном ключе
Double Вещественное число с переменной точностью размером 8 байт. Не может быть использован в первичном ключе
Decimal Вещественное число с указанной точностью, до 35 десятичных знаков При использовании в колонках таблиц точность фиксирована: Decimal (22,9).
DyNumber Бинарное представление вещественного числа точностью до 38 знаков.
Допустимые значения: положительные от 1×10-130 до 1×10126–1, отрицательные от -1×10126–1 до -1×10-130 и 0.
Совместим с типом Number AWS DynamoDB. Не рекомендуется для использования в ydb-native приложениях.

Строковые типы

Тип Описание Примечания
String Строка, может содержать произвольные бинарные данные
Utf8 Текст в кодировке UTF-8
Json JSON в текстовом представлении Не поддерживает возможность сравнения, не может быть использован в первичном ключе
JsonDocument JSON в бинарном индексированном представлении Не поддерживает возможность сравнения, не может быть использован в первичном ключе
Yson YSON в текстовом или бинарном представлении Не поддерживает возможность сравнения, не может быть использован в первичном ключе
Uuid Универсальный идентификатор UUID

Ограничения на размер

Максимальный размер значения в ячейке неключевого столбца с любым строковым типом данных — 8 МБ.

В отличие от типа данных Json, который хранит исходное текстовое представление, переданное пользователем, JsonDocument использует бинарное индексированное представление. Важное отличие с точки зрения семантики состоит в том, что JsonDocument не сохраняет форматирование, порядок ключей в объектах и их дубликаты.

За счет индексированного представления JsonDocument позволяет обходить документную модель с использованием JsonPath без необходимости парсинга всего содержимого. Это позволяет эффективно выполнять операции из JSON API, уменьшая задержки и стоимость пользовательских запросов. Выполнение запросов над JsonDocument может быть до нескольких раз эффективнее в зависимости от типа нагрузки.

Из-за добавленной избыточности JsonDocument менее эффективен в хранении. Дополнительные накладные расходы на хранение зависят от конкретного содержимого и в среднем составляют 20–30% от исходного объема. Сохранение данных в формате JsonDocument требует дополнительной конвертации из текстового представления, что делает его запись менее эффективной. Тем не менее, для большинства read-intensive сценариев, подразумевающих обработку данных из JSON, этот тип данных является предпочтительным и рекомендуется к использованию.

Важно

Для хранения чисел (JSON Number) в JsonDocument, а также для арифметических операций над ними в JSON API используется тип Double. Возможна потеря точности при использовании нестандартных представлений чисел в исходном JSON-документе.

Дата и время

Тип Описание Примечания
Date Дата, точность до дней Диапазон значений для всех временных типов кроме Interval - от нуля часов 01.01.1970 до нуля часов 01.01.2106. Внутреннее представление Date – беззнаковое целое 16 бит
Datetime Дата/время, точность до секунд Внутреннее представление – беззнаковое целое 32 бит
Timestamp Дата/время, точность до микросекунд Внутреннее представление – беззнаковое целое 64 бит
Interval Интервал времени (знаковый), точность до микросекунд Диапазон значений – от -136 лет до +136 лет. Внутреннее представление – знаковое целое 64 бит. Не может быть использован в первичном ключе
TzDate Дата с меткой временной зоны, точность до дней Не поддерживается в столбцах таблиц
TzDateTime Дата/время с меткой временной зоны, точность до секунд Не поддерживается в столбцах таблиц
TzTimestamp Дата/время с меткой временной зоны, точность до микросекунд Не поддерживается в столбцах таблиц

Особенности поддержки типов с меткой временной зоны

Метка временной зоны у типов TzDate, TzDatetime, TzTimestamp это атрибут, который используется:

Само значение позиции во времени у этих типов хранится в UTC, и метка таймзоны никак не участвует в прочих расчётах. Например:

SELECT --эти выражения всегда true для любых таймзон: таймзона не влияет на точку во времени.
    AddTimezone(CurrentUtcDate(), "Europe/Moscow") ==
        AddTimezone(CurrentUtcDate(), "America/New_York"),
    AddTimezone(CurrentUtcDatetime(), "Europe/Moscow") ==
        AddTimezone(CurrentUtcDatetime(), "America/New_York");

Важно понимать, что при преобразованиях между TzDate и TzDatetime или TzTimestamp дате соответствует не полночь по локальному времени таймзоны, а полночь по UTC для даты в UTC.

Приведение простых типов данных

Явное приведение

Явное приведение при помощи CAST:

Приведение к численным типам

Тип Bool Int8 Int16 Int32 Int64 Uint8 Uint16 Uint32 Uint64 Float Double Decimal
Bool Да1 Да1 Да1 Да1 Да1 Да1 Да1 Да1 Да1 Да1 Нет
Int8 Да2 Да Да Да Да3 Да3 Да3 Да3 Да Да Да
Int16 Да2 Да4 Да Да Да3,4 Да3 Да3 Да3 Да Да Да
Int32 Да2 Да4 Да4 Да Да3,4 Да3,4 Да3 Да3 Да Да Да
Int64 Да2 Да4 Да4 Да4 Да3,4 Да3,4 Да3,4 Да3 Да Да Да
Uint8 Да2 Да4 Да Да Да Да Да Да Да Да Да
Uint16 Да2 Да4 Да4 Да Да Да4 Да Да Да Да Да
Uint32 Да2 Да4 Да4 Да4 Да Да4 Да4 Да Да Да Да
Uint64 Да2 Да4 Да4 Да4 Да4 Да4 Да4 Да4 Да Да Да
Float Да2 Да4 Да4 Да4 Да4 Да3,4 Да3,4 Да3,4 Да3,4 Да Нет
Double Да2 Да4 Да4 Да4 Да4 Да3,4 Да3,4 Да3,4 Да3,4 Да Нет
Decimal Нет Да Да Да Да Да Да Да Да Да Да
String Да Да Да Да Да Да Да Да Да Да Да Да
Utf8 Да Да Да Да Да Да Да Да Да Да Да Да
Json Нет Нет Нет Нет Нет Нет Нет Нет Нет Нет Нет Нет
Yson Да5 Да5 Да5 Да5 Да5 Да5 Да5 Да5 Да5 Да5 Да5 Нет
Uuid Нет Нет Нет Нет Нет Нет Нет Нет Нет Нет Нет Нет
Date Нет Да4 Да4 Да Да Да4 Да Да Да Да Да Да
Datetime Нет Да4 Да4 Да4 Да Да4 Да4 Да Да Да Да Нет
Timestamp Нет Да4 Да4 Да4 Да4 Да4 Да4 Да4 Да Да Да Нет
Interval Нет Да4 Да4 Да4 Да Да3,4 Да3,4 Да3,4 Да3 Да Да Нет

1 True преобразуется в 1, False преобразуется в 0.
2 Любое значение кроме 0 преобразуется в True, 0 преобразуется в False.
3 Возможно только в случае неотрицательного значения.
4 Возможно только в случае попадания в диапазон допустимых значений.
5 При помощи встроенной функции Yson::ConvertTo.

Приведение к типам данных даты и времени

Тип Date Datetime Timestamp Interval
Bool Нет Нет Нет Нет
Int8 Да Да Да Да
Int16 Да Да Да Да
Int32 Да Да Да Да
Int64 Да Да Да Да
Uint8 Да Да Да Да
Uint16 Да Да Да Да
Uint32 Да Да Да Да
Uint64 Да Да Да Да
Float Нет Нет Нет Нет
Double Нет Нет Нет Нет
Decimal Нет Нет Нет Нет
String Да Да Да Да
Utf8 Да Да Да Да
Json Нет Нет Нет Нет
Yson Нет Нет Нет Нет
Uuid Нет Нет Нет Нет
Date Да Да Нет
Datetime Да Да Нет
Timestamp Да Да Нет
Interval Нет Нет Нет

Приведение к другим типам данных

Тип String Utf8 Json Yson Uuid
Bool Да Нет Нет Нет Нет
Int8 Да Нет Нет Нет Нет
Int16 Да Нет Нет Нет Нет
Int32 Да Нет Нет Нет Нет
Int64 Да Нет Нет Нет Нет
Uint8 Да Нет Нет Нет Нет
Uint16 Да Нет Нет Нет Нет
Uint32 Да Нет Нет Нет Нет
Uint64 Да Нет Нет Нет Нет
Float Да Нет Нет Нет Нет
Double Да Нет Нет Нет Нет
Decimal Да Нет Нет Нет Нет
String Да Да Да Да
Utf8 Да Нет Нет Нет
Json Да Да Нет Нет
Yson Да1 Нет Нет Нет Нет
Uuid Да Да Нет Нет
Date Да Да Нет Нет Нет
Datetime Да Да Нет Нет Нет
Timestamp Да Да Нет Нет Нет
Interval Да Да Нет Нет Нет

1 При помощи встроенной функции Yson::ConvertTo.

Примеры
SELECT
    CAST("12345" AS Double),                -- 12345.0
    CAST(1.2345 AS Uint8),                  -- 1
    CAST(12345 AS String),                  -- "12345"
    CAST("1.2345" AS Decimal(5, 2)),        -- 1.23
    CAST("xyz" AS Uint64) IS NULL,          -- true, так как не удалось
    CAST(-1 AS Uint16) IS NULL,             -- true, отрицательное в беззнаковое
    CAST([-1, 0, 1] AS List<Uint8?>),             -- [null, 0, 1]
        --Тип элемента опциональный: неудачный элемент в null.
    CAST(["3.14", "bad", "42"] AS List<Float>),   -- [3.14, 42]
        --Тип элемента не опциональный: неудачный элемент удалён.
    CAST(255 AS Uint8),                     -- 255
    CAST(256 AS Uint8) IS NULL              -- true, выходит за диапазон

Неявное приведение

Неявное приведение типов, которое возникает в базовых операциях (+, -, *, /, %) между разными типами данных. В ячейках таблицы указан тип результата операции, если она возможна:

Численные типы

При несовпадении численных типов сначала выполняется BitCast обоих аргументов к типу результата, а потом уже операция.

Тип Int8 Int16 Int32 Int64 Uint8 Uint16 Uint32 Uint64 Float Double
Int8 Int16 Int32 Int64 Int8 Uint16 Uint32 Uint64 Float Double
Int16 Int16 Int32 Int64 Int16 Int16 Uint32 Uint64 Float Double
Int32 Int32 Int32 Int64 Int32 Int32 Int32 Uint64 Float Double
Int64 Int64 Int64 Int64 Int64 Int64 Int64 Int64 Float Double
Uint8 Int8 Int16 Int32 Int64 Uint16 Uint32 Uint64 Float Double
Uint16 Uint16 Int16 Int32 Int64 Uint16 Uint32 Uint64 Float Double
Uint32 Uint32 Uint32 Int32 Int64 Uint32 Uint32 Uint64 Float Double
Uint64 Uint64 Uint64 Uint64 Int64 Uint64 Uint64 Uint64 Float Double
Float Float Float Float Float Float Float Float Float Double
Double Double Double Double Double Double Double Double Double Double

Типы даты и времени

Тип Date Datetime Timestamp Interval TzDate TzDatetime TzTimestamp
Date Date
Datetime Datetime
Timestamp Timestamp
Interval Date Datetime Timestamp TzDate TzDatetime TzTimestamp
TzDate TzDate
TzDatetime TzDatetime
TzTimestamp TzTimestamp
Предыдущая
Следующая