Функции Кодирования
char
Возвращает строку с длиной равной количеству переданных аргументов, и каждый байт имеет значение соответствующего аргумента. Принимает несколько аргументов числовых типов. Если значение аргумента выходит за пределы диапазона типа UInt8, оно преобразуется в UInt8 с возможным округлением и переполнением.
Синтаксис
Аргументы
number_1, number_2, ..., number_n
— Числовые аргументы, интерпретируемые как целые числа. Типы: Int, Float.
Возвращаемое значение
- строка заданных байтов. String.
Пример
Запрос:
Результат:
Вы можете сконструировать строку произвольной кодировки, передавая соответствующие байты. Вот пример для UTF-8:
Запрос:
Результат:
Запрос:
Результат:
hex
Возвращает строку, содержащую шестнадцатеричное представление аргумента.
Псевдоним: HEX
.
Синтаксис
Функция использует заглавные буквы A-F
и не использует никаких префиксов (типа 0x
) или суффиксов (типа h
).
Для целочисленных аргументов она выводит шестнадцатеричные цифры ("нибблы") от наиболее значительного к наименее значительному (big-endian или "читаемый человеком" порядок). Начинает с наиболее значимого ненулевого байта (ведущие нулевые байты опускаются), но всегда выводит обе цифры каждого байта, даже если ведущая цифра нулевая.
Значения типа Date и DateTime форматируются как соответствующие целые числа (количество дней с Эпохи для Date и значение Unix Timestamp для DateTime).
Для String и FixedString все байты просто кодируются как две шестнадцатеричные цифры. Нулевые байты не опускаются.
Значения Float и Decimal типов кодируются как их представление в памяти. Так как мы поддерживаем архитектуру little-endian, они кодируются в little-endian. Нулевые ведущие/окончательные байты не опускаются.
Значения типа UUID кодируются в виде строки в порядке big-endian.
Аргументы
arg
— Значение, которое необходимо преобразовать в шестнадцатеричное. Типы: String, UInt, Float, Decimal, Date или DateTime.
Возвращаемое значение
- Строка с шестнадцатеричным представлением аргумента. String.
Примеры
Запрос:
Результат:
Запрос:
Результат:
Запрос:
Результат:
Запрос:
Результат:
unhex
Выполняет противоположную операцию hex. Он интерпретирует каждую пару шестнадцатеричных цифр (в аргументе) как число и преобразует его в байт, представленный этим числом. Возвращаемое значение — бинарная строка (BLOB).
Если вы хотите преобразовать результат в число, вы можете использовать функции reverse и reinterpretAs<Type>.
Если unhex
вызывается из clickhouse-client
, бинарные строки отображаются с использованием UTF-8.
Псевдоним: UNHEX
.
Синтаксис
Аргументы
arg
— Строка, содержащая любое количество шестнадцатеричных цифр. String, FixedString.
Поддерживаются как заглавные, так и строчные буквы A-F
. Количество шестнадцатеричных цифр не должно быть четным. Если оно нечетное, последняя цифра интерпретируется как наименее значимая половина байта 00-0F
. Если строка аргумента содержит что-то кроме шестнадцатеричных цифр, возвращается некоторый результат, определяемый реализацией (исключение не выбрасывается). Для числового аргумента обратная операция hex(N) не выполняется с помощью unhex().
Возвращаемое значение
- Бинарная строка (BLOB). String.
Пример
Запрос:
Результат:
Запрос:
Результат:
bin
Возвращает строку, содержащую двоичное представление аргумента.
Синтаксис
Псевдоним: BIN
.
Для целочисленных аргументов она выводит двоичные цифры от наиболее значительного к наименее значительному (big-endian или "читаемый человеком" порядок). Начинает с наиболее значимого ненулевого байта (ведущие нулевые байты опускаются), но всегда выводит восемь цифр каждого байта, даже если ведущая цифра нулевая.
Значения типа Date и DateTime форматируются как соответствующие целые числа (количество дней с Эпохи для Date
и значение Unix Timestamp для DateTime
).
Для String и FixedString все байты просто кодируются как восемь двоичных чисел. Нулевые байты не опускаются.
Значения типов Float и Decimal кодируются как их представление в памяти. Так как мы поддерживаем архитектуру little-endian, они кодируются в little-endian. Нулевые ведущие/окончательные байты не опускаются.
Значения типа UUID кодируются как строка в порядке big-endian.
Аргументы
arg
— Значение, которое необходимо преобразовать в двоичное. String, FixedString, UInt, Float, Decimal, Date или DateTime.
Возвращаемое значение
- Строка с двоичным представлением аргумента. String.
Примеры
Запрос:
Результат:
Запрос:
Результат:
Запрос:
Результат:
Запрос:
Результат:
unbin
Интерпретирует каждую пару двоичных цифр (в аргументе) как число и преобразует его в байт, представленный этим числом. Функция выполняет противоположную операцию bin.
Синтаксис
Псевдоним: UNBIN
.
Для числового аргумента unbin()
не возвращает обратное значение bin()
. Если вы хотите преобразовать результат в число, вы можете использовать функции reverse и reinterpretAs<Type>.
Если unbin
вызывается из clickhouse-client
, бинарные строки отображаются с использованием UTF-8.
Поддерживаются двоичные цифры 0
и 1
. Количество двоичных цифр не обязательно должно быть кратным восьми. Если строка аргумента содержит что-то кроме двоичных цифр, возвращается некоторый результат, определяемый реализацией (исключение не выбрасывается).
Аргументы
arg
— Строка, содержащая любое количество двоичных цифр. String.
Возвращаемое значение
- Бинарная строка (BLOB). String.
Примеры
Запрос:
Результат:
Запрос:
Результат:
bitmaskToList(num)
Принимает целое число. Возвращает строку, содержащую список степеней двух, которые в сумме дают исходное число. Они разделены запятыми без пробелов в текстовом формате, в порядке возрастания.
bitmaskToArray(num)
Принимает целое число. Возвращает массив чисел типа UInt64, содержащий список степеней двух, которые в сумме дают исходное число. Числа в массиве расположены в порядке возрастания.
bitPositionsToArray(num)
Принимает целое число и преобразует его в неотрицательное целое число. Возвращает массив чисел UInt64
, содержащий список позиций битов аргумента, равных 1
, в порядке возрастания.
Синтаксис
Аргументы
arg
— Целое значение. Int/UInt.
Возвращаемое значение
Пример
Запрос:
Результат:
Запрос:
Результат:
mortonEncode
Вычисляет код Мортона (ZCurve) для списка неотрицательных целых чисел.
Функция имеет два режима работы:
- Простой
- Расширенный
Простой режим
Принимает до 8 неотрицательных целых чисел в качестве аргументов и выдает код UInt64.
Синтаксис
Параметры
args
: до 8 неотрицательных целых чисел или колонок указанного типа.
Возвращаемое значение
- Код UInt64. UInt64
Пример
Запрос:
Результат:
Расширенный режим
Принимает маску диапазона (tuple) в качестве первого аргумента и до 8 неотрицательных целых чисел в качестве других аргументов.
Каждое число в маске настраивает количество расширения диапазона:
1 - без расширения
2 - 2x расширение
3 - 3x расширение
...
До 8x расширения.
Синтаксис
Параметры
range_mask
: 1-8.args
: до 8 неотрицательных целых чисел или колонок указанного типа.
Примечание: при использовании колонок для args
предоставленная кортежная маска по-прежнему должна быть константой.
Возвращаемое значение
- Код UInt64. UInt64
Пример
Расширение диапазона может быть полезным, когда вам нужно подобное распределение для аргументов с сильно различающимися диапазонами (или кардинальностью). Например: 'IP Address' (0...FFFFFFFF) и 'Country code' (0...FF).
Запрос:
Результат:
Примечание: размер кортежа должен быть равен количеству других аргументов.
Пример
Код Мортона для одного аргумента всегда соответствует самому аргументу:
Запрос:
Результат:
Пример
Также возможно расширить один аргумент:
Запрос:
Результат:
Пример
Вы также можете использовать имена колонок в функции.
Запрос:
Сначала создайте таблицу и вставьте данные.
Используйте имена колонок вместо констант в качестве аргументов для mortonEncode
.
Запрос:
Результат:
детали реализации
Пожалуйста, обратите внимание, что вы можете вместить лишь столько битов информации в код Мортона, сколько может содержать UInt64. Два аргумента будут иметь диапазон максимум 2^32 (64/2) каждый, три аргумента — диапазон максимум 2^21 (64/3) каждый и так далее. Все переполнения будут обрезаны до нуля.
mortonDecode
Декодирует код Мортона (ZCurve) в соответствующий кортеж неотрицательных целых чисел.
Как и в функции mortonEncode
, эта функция имеет два режима работы:
- Простой
- Расширенный
Простой режим
Принимает размер результирующего кортежа в качестве первого аргумента и код во втором аргументе.
Синтаксис
Параметры
tuple_size
: целое значение не более 8.code
: UInt64 код.
Возвращаемое значение
Пример
Запрос:
Результат:
Расширенный режим
Принимает маску диапазона (кортеж) в качестве первого аргумента и код во втором аргументе.
Каждое число в маске настраивает количество сжатия диапазона:
1 - без сжатия
2 - 2x сжатие
3 - 3x сжатие
...
До 8x сжатия.
Расширение диапазона может быть полезным, когда вам нужно подобное распределение для аргументов с сильно различающимися диапазонами (или кардинальностью). Например: 'IP Address' (0...FFFFFFFF) и 'Country code' (0...FF). Как и в функции кодирования, это ограничено максимум 8 числами.
Пример
Код Мортона для одного аргумента всегда будет соответствовать самому аргументу (в качестве кортежа).
Запрос:
Результат:
Пример
Один аргумент с кортежем, указывающим сдвиги битов, будет сдвинут вправо соответственно.
Запрос:
Результат:
Пример
Функция принимает колонку кодов в качестве второго аргумента:
Сначала создайте таблицу и вставьте некоторые данные.
Запрос:
Используйте имена колонок вместо констант в качестве аргументов для mortonDecode
.
Запрос:
Результат:
hilbertEncode
Вычисляет код для кривой Хилберта для списка неотрицательных целых чисел.
Функция имеет два режима работы:
- Простой
- Расширенный
Простой режим
Простой: принимает до 2 неотрицательных целых чисел в качестве аргументов и выдает код UInt64.
Синтаксис
Параметры
args
: до 2 неотрицательных целых чисел или колонок указанного типа.
Возвращаемое значение
- Код UInt64
Тип: UInt64
Пример
Запрос:
Результат:
Расширенный режим
Принимает маску диапазона (tuple) в качестве первого аргумента и до 2 неотрицательных целых чисел в качестве других аргументов.
Каждое число в маске настраивает количество бит, на которые соответствующий аргумент будет сдвинут влево, эффективно масштабируя аргумент в пределах его диапазона.
Синтаксис
Параметры
range_mask
: (tuple)args
: до 2 неотрицательных целых чисел или колонок указанного типа.
Примечание: при использовании колонок для args
предоставленная кортежная маска по-прежнему должна быть константой.
Возвращаемое значение
- Код UInt64
Тип: UInt64
Пример
Расширение диапазона может быть полезным, когда вам нужно подобное распределение для аргументов с сильно различающимися диапазонами (или кардинальностью). Например: 'IP Address' (0...FFFFFFFF) и 'Country code' (0...FF).
Запрос:
Результат:
Примечание: размер кортежа должен быть равен количеству других аргументов.
Пример
Для единственного аргумента без кортежа функция возвращает сам аргумент в качестве индекса Хилберта, так как маппинг измерений не требуется.
Запрос:
Результат:
Пример
Если единственный аргумент представлен с кортежем, указывающим сдвиги битов, функция сдвигает аргумент влево на указанное количество бит.
Запрос:
Результат:
Пример
Функция также принимает колонки в качестве аргументов:
Запрос:
Сначала создайте таблицу и вставьте некоторые данные.
Используйте имена колонок вместо констант в качестве аргументов для hilbertEncode
.
Запрос:
Результат:
детали реализации
Пожалуйста, обратите внимание, что вы можете вместить лишь столько битов информации в код Хилберта, сколько может содержать UInt64. Два аргумента будут иметь диапазон максимум 2^32 (64/2) каждый. Все переполнения будут обрезаны до нуля.
hilbertDecode
Декодирует индекс кривой Хилберта обратно в кортеж неотрицательных целых чисел, представляющих координаты в многомерном пространстве.
Как и в функции hilbertEncode
, эта функция имеет два режима работы:
- Простой
- Расширенный
Простой режим
Принимает до 2 неотрицательных целых чисел в качестве аргументов и выдает код UInt64.
Синтаксис
Параметры
tuple_size
: целое значение не более 2.code
: UInt64 код.
Возвращаемое значение
- tuple указанного размера.
Тип: UInt64
Пример
Запрос:
Результат:
Расширенный режим
Принимает маску диапазона (кортеж) в качестве первого аргумента и до 2 неотрицательных целых чисел в качестве других аргументов. Каждое число в маске настраивает количество бит, на которые соответствующий аргумент будет сдвинут влево, эффективно масштабируя аргумент в пределах его диапазона.
Расширение диапазона может быть полезным, когда вам нужно подобное распределение для аргументов с сильно различающимися диапазонами (или кардинальностью), как, например, 'IP Address' (0...FFFFFFFF) и 'Country code' (0...FF). Как и в функции кодирования, это ограничено максимум 8 числами.
Пример
Код Хилберта для одного аргумента всегда будет соответствовать самому аргументу (в качестве кортежа).
Запрос:
Результат:
Пример
Единственный аргумент с кортежем, указывающим сдвиги битов, будет сдвинут вправо соответственно.
Запрос:
Результат:
Пример
Функция принимает колонку кодов в качестве второго аргумента:
Сначала создайте таблицу и вставьте некоторые данные.
Запрос:
Используйте имена колонок вместо констант в качестве аргументов для hilbertDecode
.
Запрос:
Результат: