Типы данных#

CedrusData содержит набор встроенных типов данных, описанных ниже. Система типов CedrusData может быть расширена с помощью плагинов.

Поддержка и сопоставление типов коннекторов#

Коннекторы CedrusData работают источниками данных, которые могут иметь другую систему типов.
Каждый коннектор определяет, как сопоставить типы данных источника с типами данных CedrusData:

  • Сопоставление от источника данных к CedrusData применяется в операциях, где CedrusData читает данные источника. Например, в операции SELECT.

  • Сопоставление от CedrusData к источнику данных применяется в операциях, где CedrusData изменяет данные в источнике. Например, в операции CREATE TABLE AS. Предикаты (например, WHERE) также используют эти сопоставления, чтобы гарантировать, что предикат транслируется в допустимый синтаксис в удаленном источнике данных.

Поддержка типов данных и их сопоставление различаются в зависимости от коннектора. Обратитесь к документации коннекторов для получения дополнительной информации.

Булевый тип#

BOOLEAN#

Этот тип представляет булевы значения true и false.

Целочисленные типы#

Целые числа могут быть выражены в виде литералов в следующих форматах:

  • Десятичное целое. Примеры: -7, 0 или 3.

  • Шестнадцатеричное целое, состоящее из 0X или 0x и значения. Примеры: 0x0A для десятичного 10 или 0x11 для десятичного 17.

  • Восьмеричное целое, состоящее из 0O или 0o и значения. Примеры: 0o40 для десятичного 32 или 0o11 для десятичного 9.

  • Двоичное целое, состоящее из 0B или 0b и значения. Примеры: 0b1001 для десятичного 9 или 0b101010 for десятичного 42.

Символы подчеркивания игнорируются в литералах и могут быть использованы для повышения читаемости. Например, десятичное целое 123_456.789_123 эквивалентно 123456.789123. Подчеркивания в начале и в конце литерала запрещены.

TINYINT#

8-битное знаковое целое число в дополнительном коде с минимальным значением -2^7 или -0x80 и максимальным значением 2^7 - 1 или 0x7F.

SMALLINT#

16-битное знаковое целое число в дополнительном коде с минимальным значением -2^15 или -0x8000 и максимальным значением 2^15 - 1 или 0x7FFF.

INTEGER или INT#

32-битное знаковое целое число в дополнительном коде с минимальным значением -2^31 или -0x80000000 и максимальным значением 2^31 - 1 или 0x7FFFFFFF.

BIGINT#

64-битное знаковое целое число в дополнительном коде с минимальным значением -2^63 или -0x8000000000000000 и максимальным значением 2^63 - 1 или 0x7FFFFFFFFFFFFFFF.

Типы с плавающей точкой#

Числа с плавающей точкой могут быть выражены в виде литералов с экспоненциальной нотацией, такой как 1.03e1 (тип DOUBLE). Символы подчеркивания игнорируются в литеральных значениях и могут использоваться для повышения читаемости. Например, значение 123_456.789e4 эквивалентно 123456.789e4. Подчеркивания в начале, в конце и рядом с запятой (.) запрещены.

REAL#

Тип REAL — это 32-битное неточное число с переменной точностью, реализующее стандарт IEEE 754 для двоичной арифметики с плавающей точкой.

Примеры литералов: REAL '10.3', REAL '10.3e0', REAL '1.03e1'

DOUBLE#

Тип DOUBLE — это 64-битное неточное число с переменной точностью, реализующее стандарт IEEE 754 для двоичной арифметики с плавающей точкой.

Примеры литералов: DOUBLE '10.3', DOUBLE '1.03e1', 10.3e0, 1.03e1

Точные числовые типы#

Точные числовые значения могут быть выражены в виде литералов в десятичной нотации, например 1.1 (тип DECIMAL).

Символы подчеркивания игнорируются и могут использоваться для повышения читаемости. Например, десятичное 123_456.789_123 эквивалентно 123456.789123. Подчеркивания в начале, в конце и рядом с запятой (.) запрещены.

Ведущие нули в десятичных литералах будут проигнорированы. Например, 000123.456 эквивалентно 123.456.

DECIMAL#

Точное десятичное число. Поддерживается точность до 38 цифр, но лучшая производительность достигается при точности до 18 цифр.

Тип decimal принимает два параметра:

  • precision - общее количество цифр

  • scale - количество цифр в дробной части. Scale необязателен и по умолчанию равен 0.

Примеры определения типа: DECIMAL(10,3), DECIMAL(20)

Примеры литералов: DECIMAL '10.3', DECIMAL '1234567890', 1.1

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

VARCHAR#

Символьные данные переменной длины с необязательной максимальной длиной.

Примеры определения типа: varchar, varchar(20)

CedrusData поддерживает простые и Unicode литералы:

  • строковый литерал: 'Hello winter !'

  • Unicode-строка с символом экранирования по умолчанию: U&'Hello winter \2603 !'

  • Unicode-строка с пользовательским символом экранирования: U&'Hello winter #2603 !' UESCAPE '#'

Unicode-строка начинается с префикса U& и требует символа экранирования перед любым 4-значным символом Unicode. В примерах выше \2603 и #2603 представляют символ снеговика. Длинные коды Unicode с 6 цифрами требуют использования символа плюс перед кодом. Например, для эмодзи улыбающегося лица нужно использовать \+01F600.

Одинарные кавычки в строковых литералах могут быть экранированы с помощью другой одинарной кавычки: 'I am big, it''s the pictures that got small!'

CHAR#

Символьные данные фиксированной длины. Тип CHAR без указанной длины имеет длину по умолчанию 1. Значение CHAR(x) всегда имеет x символов. Например, приведение dog к CHAR(7) добавляет 4 пробела в конце. Начальные и конечные пробелы учитываются при сравнении значений CHAR. В результате два символьных значения с разной длиной (CHAR(x) и CHAR(y), где x != y) никогда не будут равны. Как и в случае с VARCHAR, одинарная кавычка в литерале CHAR может быть экранирована с помощью другой одинарной кавычки:

SELECT CHAR 'All right, Mr. DeMille, I''m ready for my close-up.'

Примеры определения типа: char, char(20)

VARBINARY#

Двоичные данные переменной длины.

CedrusData поддерживает использование двоичных литералов с префиксом X или x. Двоичные данные должны использовать шестнадцатеричный формат. Например, двоичная форма eh? — это X'65683F', что можно проверить следующим оператором:

SELECT from_utf8(x'65683F');

JSON#

Тип значения JSON, который может быть объектом, массивом, числом, строкой, true, false или null.

Типы даты и времени#

См. также Функции для работы с датой и временем

DATE#

Календарная дата (год, месяц, день).

Пример: DATE '2001-08-22'

TIME#

TIME — это псевдоним для TIME(3) (точность до миллисекунды).

TIME(P)#

Время дня (час, минута, секунда) без часового пояса с P цифрами точности для дробной части секунд. Поддерживается точность до 12 (пикосекунды).

Пример: TIME '01:02:03.456'

TIME WITH TIME ZONE#

Время дня (час, минута, секунда, миллисекунда) с часовым поясом. Значения этого типа отображаются с использованием часового пояса из значения. Часовые пояса выражаются как числовое смещение относительно UTC:

SELECT TIME '01:02:03.456 -08:00';
-- 1:02:03.456-08:00

TIMESTAMP#

TIMESTAMP — это псевдоним для TIMESTAMP(3) (точность до миллисекунды).

TIMESTAMP(P)#

Календарная дата и время дня без часового пояса с P цифрами точности для дробной части секунд. Поддерживается точность до 12 (пикосекунды). Представляет собой комбинацию типов DATE и TIME(P).

TIMESTAMP(P) WITHOUT TIME ZONE — синоним.

Значения timestamp могут быть заданы с помощью ключевого слова TIMESTAMP. Языковые конструкции, такие как localtimestamp(p), или функции и операторы даты и времени могут возвращать значения timestamp.

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

Примеры:

SELECT TIMESTAMP '2020-06-10 15:55:23';
-- 2020-06-10 15:55:23

SELECT TIMESTAMP '2020-06-10 15:55:23.383345';
-- 2020-06-10 15:55:23.383345

SELECT typeof(TIMESTAMP '2020-06-10 15:55:23.383345');
-- timestamp(6)

SELECT cast(TIMESTAMP '2020-06-10 15:55:23.383345' as TIMESTAMP(1));
 -- 2020-06-10 15:55:23.4

SELECT cast(TIMESTAMP '2020-06-10 15:55:23.383345' as TIMESTAMP(12));
-- 2020-06-10 15:55:23.383345000000

TIMESTAMP WITH TIME ZONE#

TIMESTAMP WITH TIME ZONE — это псевдоним для TIMESTAMP(3) WITH TIME ZONE (точность до миллисекунды).

TIMESTAMP(P) WITH TIME ZONE#

Момент времени, который включает дату и время дня с P цифрами точности для дробной части секунд и с часовым поясом. Значения этого типа отображаются с использованием часового пояса из значения. Часовые пояса могут быть выражены следующими способами:

  • UTC, где GMT, Z или UT могут использоваться как псевдонимы для UTC.

  • +hh:mm или -hh:mm, где hh:mm — это смещение часов и минут от UTC. Может быть записано с UTC, GMT или UT в качестве псевдонима для UTC или без них.

  • Имя часового пояса IANA.

Примеры:

SELECT TIMESTAMP '2001-08-22 03:04:05.321 UTC';
-- 2001-08-22 03:04:05.321 UTC

SELECT TIMESTAMP '2001-08-22 03:04:05.321 -08:30';
-- 2001-08-22 03:04:05.321 -08:30

SELECT TIMESTAMP '2001-08-22 03:04:05.321 GMT-08:30';
-- 2001-08-22 03:04:05.321 -08:30

SELECT TIMESTAMP '2001-08-22 03:04:05.321 America/New_York';
-- 2001-08-22 03:04:05.321 America/New_York

INTERVAL YEAR TO MONTH#

Интервал, выраженный в количестве лет и месяцев.

Пример: INTERVAL '3' MONTH

INTERVAL DAY TO SECOND#

Интервал, выраженный в количестве дней, часов, минут, секунд и миллисекунд.

Пример: INTERVAL '2' DAY

Структурные типы#

ARRAY#

Массив заданного типа.

Пример: ARRAY[1, 2, 3]

MAP#

Отображение между заданными типами.

Пример: MAP(ARRAY['foo', 'bar'], ARRAY[1, 2])

ROW#

Структура, состоящая из полей, которая позволяет использовать смешанные типы. Поля могут быть любого типа SQL.

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

Пример: CAST(ROW(1, 2e0) AS ROW(x BIGINT, y DOUBLE))

Именованные поля строки доступны с помощью оператора ссылки на поле (.).

Пример: CAST(ROW(1, 2.0) AS ROW(x BIGINT, y DOUBLE)).x

Именованные или неименованные поля строки доступны по позиции с помощью оператора индекса ([]). Позиция начинается с 1 и должна быть константой.

Пример: ROW(1, 2.0)[1]

Сетевой адрес#

IPADDRESS#

IP-адрес IPv4 или IPv6. Внутренне тип является адресом IPv6. Поддержка IPv4 обрабатывается с использованием диапазона IPv4-отображенных IPv6-адресов (RFC 4291#section-2.5.5.2). При создании IPADDRESS адреса IPv4 будут отображены в этот диапазон. При форматировании IPADDRESS любой адрес в отображенном диапазоне будет отформатирован как адрес IPv4. Другие адреса будут отформатированы как IPv6 с использованием канонического формата, определенного в RFC 5952.

Примеры: IPADDRESS '10.0.0.1', IPADDRESS '2001:db8::1'

UUID#

UUID#

Представляет UUID (универсальный уникальный идентификатор) в формате RFC 4122.

Пример: UUID '12151fd2-7586-11e9-8f9e-2a86e4085a59'

HyperLogLog#

Значение приблизительного количества уникальных значений с использованием структуры данных HyperLogLog. См. Функции HyperLogLog.

HyperLogLog#

Структура HyperLogLog позволяет эффективно вычислять approx_distinct(). В зависимости от количества уникальных значений, CedrusData может использовать разреженное (sparse) или плотное (dense) представления.

P4HyperLogLog#

Структура P4HyperLogLog похожа на HyperLogLog, но всегда использует плотное представление.

SetDigest#

SetDigest#

SetDigest (setdigest) — это структура данных, используемая для вычисления коэффициента сходства Жаккара между двумя множествами.

SetDigest инкапсулирует следующие компоненты:

Структура HyperLogLog используется для приближенного подсчета уникальных элементов в исходном множестве.

Структура MinHash используется для компактного хранения сигнатуры исходного множества. Сходство любых двух множеств оценивается путем сравнения их сигнатур.

Значения SetDigest являются аддитивными, то есть их можно объединять.

Quantile digest#

QDigest#

Quantile digest (qdigest) — это структура данных, которая фиксирует приблизительное распределение данных для заданного входного набора и может быть запрошена для получения приблизительных значений квантилей из распределения. Уровень точности для qdigest может быть задан пользователем, позволяя получать более точные результаты за счет пространства.

Qdigest может использоваться для получения приблизительного ответа на запросы о том, какое значение принадлежит определенному квантилю. Полезное свойство значений qdigest заключается в том, что они аддитивны, то есть их можно объединять без потери точности.

Qdigest может быть полезен, когда частичные результаты approx_percentile могут быть повторно использованы. Например, может потребоваться ежедневное чтение 99-го процентиля значений, которые читаются в течение недели. Вместо вычисления данных за прошлую неделю с помощью approx_percentile, qdigest можно сохранять ежедневно и быстро объединять для получения значения 99-го процентиля.

T-Digest#

TDigest#

T-digest (tdigest) — это структура данных, которая фиксирует приблизительное распределение данных для заданного входного набора (аналогично qdigest). Её можно запросить для получения приблизительных значений квантилей из распределения.

TDigest имеет следующие преимущества по сравнению с QDigest:

  • более высокая производительность

  • меньшее использование памяти

  • более высокая точность на высоких и низких процентилях.

Значения T-digest являются аддитивными, то есть их можно объединять.