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

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

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

Тип

Описание

Примечания

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(precision, scale)

Вещественное число с фиксированной точностью размером 16 байт. Точность (precision) — максимальное общее число хранимых десятичных разрядов, принимает значения от 1 до 35. Масштаб (scale) — максимальное число хранимых десятичных разрядов справа от десятичной запятой, принимает значения от 0 до значения precision.

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

Момент времени, соответствующий полуночи1 по UTC, точность до дней

с 00:00 01.01.1970 до 00:00 01.01.2106

4

Date32

Момент времени, соответствующий полуночи1 по UTC, точность до дней

с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э.

4

Datetime

Момент времени по UTC, точность до секунд

с 00:00 01.01.1970 до 00:00 01.01.2106

4

Datetime64

Момент времени по UTC, точность до секунд

с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э.

8

Timestamp

Момент времени по UTC с точностью до микросекунд

с 00:00 01.01.1970 до 00:00 01.01.2106

8

Timestamp64

Момент времени по UTC с точностью до микросекунд

с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э.

8

Interval

Интервал времени, точность до микросекунд

от -136 лет до +136 лет

8

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

Interval64

Интервал времени, точность до микросекунд

от -292277 лет до +292277 лет

8

Не поддерживается в колоночных таблицах

TzDate

Момент времени по UTC, соответствующий полуночи в заданной таймзоне

с 00:00 01.01.1970 до 00:00 01.01.2106

Не поддерживается в столбцах таблиц

TzDate32

Момент времени по UTC, соответствующий полуночи в заданной таймзоне

с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э.

4 и метка таймзоны

TzDateTime

Момент времени по UTC с меткой временной зоны и точностью до секунд

с 00:00 01.01.1970 до 00:00 01.01.2106

Не поддерживается в столбцах таблиц

TzDateTime64

Момент времени по UTC с меткой временной зоны и точностью до секунд

с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э.

8 и метка таймзоны

TzTimestamp

Момент времени по UTC с меткой временной зоны и точностью до микросекунд

с 00:00 01.01.1970 до 00:00 01.01.2106

Не поддерживается в столбцах таблиц

TzTimestamp64

Момент времени по UTC с меткой временной зоны и точностью до микросекунд

с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э.

8 и метка таймзоны

1 Под полночью понимается момент времени, в котором все компоненты времени равны нулю.

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

Метка временной зоны у типов 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 Да Да Нет
Date32 Нет Да4 Да4 Да Да Да4 Да Да Да Да Да Нет
Datetime64 Нет Да4 Да4 Да4 Да Да4 Да4 Да Да Да Да Нет
Timestamp64 Нет Да4 Да4 Да4 Да4 Да4 Да4 Да4 Да Да Да Нет
Interval64 Нет Да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 Date32 Datetime64 Timestamp64 Interval64
Bool Нет Нет Нет Нет Нет Нет Нет Нет
Int8 Да Да Да Да Да Да Да Да
Int16 Да Да Да Да Да Да Да Да
Int32 Да Да Да Да Да Да Да Да
Int64 Да Да Да Да Да Да Да Да
Uint8 Да Да Да Да Да Да Да Да
Uint16 Да Да Да Да Да Да Да Да
Uint32 Да Да Да Да Да Да Да Да
Uint64 Да Да Да Да Да Да Да Да
Float Нет Нет Нет Нет Нет Нет Нет Нет
Double Нет Нет Нет Нет Нет Нет Нет Нет
Decimal Нет Нет Нет Нет Нет Нет Нет Нет
String Да Да Да Да Да Да Да Да
Utf8 Да Да Да Да Да Да Да Да
Json Нет Нет Нет Нет Нет Нет Нет Нет
Yson Нет Нет Нет Нет Нет Нет Нет Нет
Uuid Нет Нет Нет Нет Нет Нет Нет Нет
Date Да Да Нет Да Да Да Нет
Datetime Да Да Нет Да Да Да Нет
Timestamp Да Да Нет Да Да Да Нет
Interval Нет Нет Нет Нет Нет Нет Да
Date32 Да Да Да Нет Да Да Нет
Datetime64 Да Да Да Нет Да Да Нет
Timestamp64 Да Да Да Нет Да Да Нет
Interval64 Нет Нет Нет Да Нет Нет Нет

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

Тип 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 Да Да Нет Нет Нет
Date32 Да Да Нет Нет Нет
Datetime64 Да Да Нет Нет Нет
Timestamp64 Да Да Нет Нет Нет
Interval64 Да Да Нет Нет Нет

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 Date32 Datetime64 Timestamp64 Interval64 TzDate32 TzDatetime64 TzTimestamp64
Date DateTime Timestamp TzDate TzDatetime TzTimestamp Date32 DateTime64 Timestamp64 TzDate32 TzDatetime64 TzTimestamp64
Datetime Timestamp TzDatetime TzTimestamp Datetime64 Timestamp64 TzDatetime64 TzTimestamp64
Timestamp TzTimestamp Timestamp64 TzTimestamp64
Interval
TzDate TzDatetime TzTimestamp TzDate32 TzDatetime64 TzTimestamp64
TzDatetime TzTimestamp TzDatetime64 TzTimestamp64
TzTimestamp TzTimestamp64
Date32 DateTime64 Timestamp64 TzDate32 TzDatetime64 TzTimestamp64
Datetime64 Timestamp64 TzDatetime64 TzTimestamp64
Timestamp64 TzTimestamp64
Interval64
TzDate32 TzDatetime64 TzTimestamp64
TzDatetime64 TzTimestamp64
TzTimestamp64
Предыдущая
Следующая