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

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

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

Тип Описание Примечания
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 десятичных знаков

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

Тип Описание Примечания
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 Int Uint Float Double Decimal
Bool Да1 Да1 Да1 Да1 Нет
Int Да2 Да3 Да Да Да
Uint Да2 Да Да Да Да
Float Да2 Да Да Да Нет
Double Да2 Да Да Да Нет
Decimal Нет Да Да Да Да
String Да Да Да Да Да Да
Utf8 Да Да Да Да Да Да
Json Нет Нет Нет Нет Нет Нет
Yson Да4 Да4 Да4 Да4 Да4 Да4
Uuid Нет Нет Нет Нет Нет Нет
Date Нет Да Да Да Да Нет
Datetime Нет Да Да Да Да Нет
Timestamp Нет Да Да Да Да Нет
Interval Нет Да Да Да Да Нет

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

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

Тип Date Datetime Timestamp Interval
Bool Нет Нет Нет Нет
Int Да Да Да Да
Uint Да Да Да Да
Float Нет Нет Нет Нет
Double Нет Нет Нет Нет
Decimal Нет Нет Нет Нет
String Да Да Да Да
Utf8 Да Да Да Да
Json Нет Нет Нет Нет
Yson Нет Нет Нет Нет
Uuid Нет Нет Нет Нет
Date Да Да Нет
Datetime Да Да Нет
Timestamp Да Да Нет
Interval Нет Нет Нет

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

Тип String Utf8 Json Yson Uuid
Bool Да Нет Нет Нет Нет
Int Да Нет Нет Нет Нет
Uint Да Нет Нет Нет Нет
Float Да Нет Нет Нет Нет
Double Да Нет Нет Нет Нет
Decimal Да Нет Нет Нет Нет
String Да Да Да Да
Utf8 Да Нет Нет Нет
Json Да Да Нет Нет
Yson Да4 Нет Нет Нет Нет
Uuid Да Да Нет Нет
Date Да Да Нет Нет Нет
Datetime Да Да Нет Нет Нет
Timestamp Да Да Нет Нет Нет
Interval Да Да Нет Нет Нет

4 При помощи встроенной функции 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, выходит за диапазон

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

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

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

Тип Int Uint Float Double
Int Int Float Double
Uint Int Float Double
Float Float Float 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
Предыдущая
Следующая