Типы данных#

Trino имеет набор встроенных типов данных, описанных ниже. Дополнительные типы могут быть предоставлены плагинами.

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

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

В зависимости от коннектора и источника данных сопоставление типов может применяться в любом направлении:

  • Сопоставление из источника данных в Trino применяется к любой операции, где столбцы в источнике данных читаются Trino, например оператором SELECT, и базовый тип данных источника должен быть представлен типом данных Trino.

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

Поддержка типов данных и их сопоставления зависят от коннектора. Дополнительные сведения см. в документации коннектора.

Логический тип#

BOOLEAN#

Этот тип представляет логические значения true и false.

Целые числа#

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

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

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

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

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

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

Целые числа поддерживаются следующими типами данных.

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. Для этого типа можно использовать оба имени: INTEGER и INT.

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

NUMBER#

Число с плавающей точкой, десятичное число неопределенной точности не менее 50 десятичных цифр. Тип поддерживает положительные значения размером 1e-100 или меньше, а также значения размером 1e100 или больше.

SELECT NUMBER '3.1415926535897932384626433832795028841971693993751'
-- 3.1415926535897932384626433832795028841971693993751 без потери точности

SELECT NUMBER '12345678901234567890123456789012345678901234567890e30'
-- 1.234567890123456789012345678901234567890123456789E+79 без потери точности

Тип NUMBER поддерживает специальные значения Infinity, -Infinity и NaN с семантикой, похожей на типы с плавающей точкой:

SELECT NUMBER 'Infinity';
-- Infinity

SELECT NUMBER '-Infinity';
-- -Infinity

SELECT NUMBER 'NaN';
-- NaN

Деление на ноль возвращает Infinity, -Infinity или NaN вместо ошибки:

SELECT NUMBER '1' / NUMBER '0';
-- Infinity

SELECT NUMBER '0' / NUMBER '0';
-- NaN

NaN не равно никакому значению, включая само себя:

SELECT NUMBER 'NaN' = NUMBER 'NaN';
-- false

Упорядочивание следует соглашению: -Infinity < все конечные значения < Infinity < NaN.

Примеры литералов: NUMBER '10.3', NUMBER '1234567890', NUMBER '1e3', NUMBER 'Infinity', NUMBER 'NaN'

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

Точные числовые значения можно выражать числовыми литералами, такими как 1.1; они поддерживаются типом данных DECIMAL.

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

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

DECIMAL#

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

Десятичный тип принимает два литеральных параметра:

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

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

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

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

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

VARCHAR#

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

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

SQL-операторы поддерживают как простые литералы, так и Unicode:

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

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

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

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

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

CHAR#

Символьные данные фиксированной длины. Тип CHAR без указанной длины имеет длину по умолчанию 1. Значение CHAR(x) всегда имеет фиксированную длину x символов. Например, приведение dog к CHAR(7) добавляет четыре неявных завершающих пробела.

Как и в VARCHAR, одинарную кавычку в литерале CHAR можно экранировать другой одинарной кавычкой:

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

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

VARBINARY#

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

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

SELECT from_utf8(x'65683F');

Двоичные литералы игнорируют любые пробельные символы. Например, литерал X'FFFF 0FFF  3FFF FFFF' эквивалентен X'FFFF0FFF3FFFFFFF'.

Note

Двоичные строки с длиной пока не поддерживаются: varbinary(n)

JSON#

Тип значения JSON, которым может быть объект JSON, массив JSON, число 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. Кроме того, значения timestamp могут возвращать языковые конструкции, такие как localtimestamp(p), или ряд функций и операторов даты и времени.

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

Следующие примеры иллюстрируют это поведение:

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#

Отображение между указанными типами компонентов. Отображение — это коллекция пар ключ-значение, где каждый ключ связан с одним значением. Ключи отображения обязательны, а значения отображения могут быть null.

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

Дополнительные сведения см. в Функции и операторы map.

ROW#

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

По умолчанию поля row не имеют имен, но им можно назначить имена.

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

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

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

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

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

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

IPADDRESS#

IP-адрес, который может представлять адрес IPv4 или IPv6. Внутри тип является чистым адресом IPv6. Поддержка IPv4 реализуется с использованием диапазона IPv4-mapped IPv6 address (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 (Universally Unique IDentifier), также известный как GUID (Globally Unique IDentifier), с использованием формата, определенного в RFC 4122.

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

HyperLogLog#

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

HyperLogLog#

Скетч HyperLogLog позволяет эффективно вычислять approx_distinct(). Он начинает работу как разреженное представление и переключается на плотное представление, когда оно становится эффективнее.

P4HyperLogLog#

Скетч P4HyperLogLog похож на HyperLogLog, но начинает работу в плотном представлении и остается в нем.

SetDigest#

SetDigest#

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

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

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

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

SetDigest аддитивны, то есть их можно объединять друг с другом.

Квантильный дайджест#

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 аддитивны, то есть их можно объединять друг с другом.