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

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

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

Тип Описание Примечания
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 десятичных знаков
DyNumber Бинарное представление вещественного числа точностью до 38 знаков.
Допустимые значения: положительные от 1×10-130 до 1×10126–1, отрицательные от -1×10126–1 до -1×10-130 и 0.
Совместим с типом Number AWS DynamoDB. Не рекомендуется для использования в YTsaurus-native приложениях.

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

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

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

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

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

Важно

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

Дата и время

Базовые типы

Диапазон значений всех базовых временных типов – от полуночи1 01.01.1970 до полуночи1 01.01.2106.
Диапазон значений базового типа интервала – от -136 лет до +136 лет.

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

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

Расширенные типы

Диапазон значений всех расширенных временных типов – от полуночи1 01.01.144169 до н.э. до полуночи1 01.01.148107.
Диапазон значений расширенного типа интервала – от -292277 лет до +292277 лет.

Тип Описание Примечания
Date32 Момент времени, в который происходит полночь1 по UTC, точность до дней Внутреннее представление Date32 – знаковое целое 32 бит
Datetime64 Момент времени по UTC, точность до секунд Внутреннее представление – знаковое целое 64 бит
Timestamp64 Момент времени по UTC, точность до микросекунд Внутреннее представление – знаковое целое 64 бит
Interval64 Интервал времени, точность до микросекунд Внутреннее представление – знаковое целое 64 бит
TzDate32 Момент времени по UTC, в который происходит полночь в заданной таймзоне Внутреннее представление – знаковое целое 32 бит и метка таймзоны
TzDateTime64 Момент времени по UTC с меткой временной зоны, точность до секунд Внутреннее представление – знаковое целое 64 бит и метка таймзоны
TzTimestamp64 Момент времени по UTC с меткой временной зоны, точность до микросекунд Внутреннее представление – знаковое целое 64 бит и метка таймзоны

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
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 Нет Нет Нет Да
Расширенные типы
Тип 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
Date DateTime Timestamp TzDate TzDatetime TzTimestamp
Datetime Timestamp TzDatetime TzTimestamp
Timestamp TzTimestamp
Interval
TzDate TzDatetime TzTimestamp
TzDatetime TzTimestamp
TzTimestamp
Date32
Datetime64
Timestamp64
Interval64
TzDate32
TzDatetime64
TzTimestamp64
Расширенные типы
Тип Date32 Datetime64 Timestamp64 Interval64 TzDate32 TzDatetime64 TzTimestamp64
Date Date32 DateTime64 Timestamp64 TzDate32 TzDatetime64 TzTimestamp64
Datetime Datetime64 Timestamp64 TzDatetime64 TzTimestamp64
Timestamp Timestamp64 TzTimestamp64
Interval
TzDate TzDate32 TzDatetime64 TzTimestamp64
TzDatetime TzDatetime64 TzTimestamp64
TzTimestamp TzTimestamp64
Date32 DateTime64 Timestamp64 TzDate32 TzDatetime64 TzTimestamp64
Datetime64 Timestamp64 TzDatetime64 TzTimestamp64
Timestamp64 TzTimestamp64
Interval64
TzDate32 TzDatetime64 TzTimestamp64
TzDatetime64 TzTimestamp64
TzTimestamp64
Предыдущая
Следующая