Примитивные типы данных
Термины «простые», «примитивные» и «элементарные» типы данных используются как синонимы.
Числовые типы
Тип |
Описание |
Примечания |
|
Логическое значение. |
Не поддерживается в колоночных таблицах |
|
Целое число со знаком. |
|
|
Целое число со знаком. |
|
|
Целое число со знаком. |
|
|
Целое число со знаком. |
|
|
Беззнаковое целое число. |
|
|
Беззнаковое целое число. |
|
|
Беззнаковое целое число. |
|
|
Беззнаковое целое число. |
|
|
Вещественное число с переменной точностью размером 4 байта. |
Не может быть использован в первичном ключе |
|
Вещественное число с переменной точностью размером 8 байт. |
Не может быть использован в первичном ключе |
|
Вещественное число с фиксированной точностью размером 16 байт. Точность (precision) — максимальное общее число хранимых десятичных разрядов, принимает значения от 1 до 35. Масштаб (scale) — максимальное число хранимых десятичных разрядов справа от десятичной запятой, принимает значения от 0 до значения precision. |
|
|
Бинарное представление вещественного числа точностью до 38 знаков. |
Не поддерживается в колоночных таблицах |
Строковые типы
Тип | Описание | Примечания |
---|---|---|
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, этот тип данных является предпочтительным и рекомендуется к использованию.
Важно
Дата и время
Тип |
Описание |
Возможные значения |
Размер (байты) |
Примечания |
|
Момент времени, соответствующий полуночи1 по UTC, точность до дней |
с 00:00 01.01.1970 до 00:00 01.01.2106 |
4 |
— |
|
Момент времени, соответствующий полуночи1 по UTC, точность до дней |
с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э. |
4 |
— |
|
Момент времени по UTC, точность до секунд |
с 00:00 01.01.1970 до 00:00 01.01.2106 |
4 |
— |
|
Момент времени по UTC, точность до секунд |
с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э. |
8 |
— |
|
Момент времени по UTC с точностью до микросекунд |
с 00:00 01.01.1970 до 00:00 01.01.2106 |
8 |
— |
|
Момент времени по UTC с точностью до микросекунд |
с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э. |
8 |
— |
|
Интервал времени, точность до микросекунд |
от -136 лет до +136 лет |
8 |
Не может использоваться в первичном ключе и в колонках, формирующих ключ вторичного индекса. Не поддерживается в колоночных таблицах |
|
Интервал времени, точность до микросекунд |
от -292277 лет до +292277 лет |
8 |
Не поддерживается в колоночных таблицах |
|
Момент времени по UTC, соответствующий полуночи в заданной таймзоне |
с 00:00 01.01.1970 до 00:00 01.01.2106 |
Не поддерживается в столбцах таблиц |
|
|
Момент времени по UTC, соответствующий полуночи в заданной таймзоне |
с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э. |
4 и метка таймзоны |
— |
|
Момент времени по UTC с меткой временной зоны и точностью до секунд |
с 00:00 01.01.1970 до 00:00 01.01.2106 |
Не поддерживается в столбцах таблиц |
|
|
Момент времени по UTC с меткой временной зоны и точностью до секунд |
с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э. |
8 и метка таймзоны |
— |
|
Момент времени по UTC с меткой временной зоны и точностью до микросекунд |
с 00:00 01.01.1970 до 00:00 01.01.2106 |
Не поддерживается в столбцах таблиц |
|
|
Момент времени по UTC с меткой временной зоны и точностью до микросекунд |
с 00:00 01.01.144169 до н.э. по 00:00 01.01.148107 н.э. |
8 и метка таймзоны |
— |
1 Под полночью понимается момент времени, в котором все компоненты времени равны нулю.
Особенности поддержки типов с меткой временной зоны
Метка временной зоны у типов TzDate
, TzDatetime
, TzTimestamp
это атрибут, который используется:
- При преобразовании (CAST, DateTime::Parse, DateTime::Format) в строку и из строки.
- В DateTime::Split - появляется компонент таймзоны в
Resource<TM>
.
Само значение позиции во времени у этих типов хранится в 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 | — | — | — | — | — | — | — | — | — | — | — | — | — | — |