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