> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по функциям кодирования

# Функции кодирования

{/*AUTOGENERATED_START*/}

<div id="bech32Decode">
  ## bech32Decode
</div>

Добавленный в: v25.6.0

Декодирует строку адреса Bech32, сгенерированную алгоритмами bech32 или bech32m.

<Note>
  В отличие от функции кодирования, `bech32Decode` автоматически обрабатывает `FixedString` с заполнением.
</Note>

**Синтаксис**

```sql theme={null}
bech32Decode(address[, 'raw'])
```

**Аргументы**

* `address` — Строка Bech32 для декодирования. [`String`](/ru/reference/data-types/string) или [`FixedString`](/ru/reference/data-types/fixedstring)
* `mode` — Необязательно. Передайте `'raw'`, чтобы декодировать без удаления первого байта, используемого как witness version. Используйте это для адресов, не относящихся к SegWit (например, Cosmos SDK). [`String`](/ru/reference/data-types/string)

**Возвращаемое значение**

Возвращает кортеж `(hrp, data)`, использованный для кодирования строки. Данные представлены в бинарном формате. [`Tuple(String, String)`](/ru/reference/data-types/tuple)

**Примеры**

**Декодирование адреса**

```sql title=Query theme={null}
SELECT tup.1 AS hrp, hex(tup.2) AS data FROM (SELECT bech32Decode('bc1w508d6qejxtdg4y5r3zarvary0c5xw7kj7gz7z') AS tup)
```

```response title=Response theme={null}
bc   751E76E8199196D454941C45D1B3A323F1433BD6
```

**Адрес тестнета**

```sql title=Query theme={null}
SELECT tup.1 AS hrp, hex(tup.2) AS data FROM (SELECT bech32Decode('tb1w508d6qejxtdg4y5r3zarvary0c5xw7kzp034v') AS tup)
```

```response title=Response theme={null}
tb   751E76E8199196D454941C45D1B3A323F1433BD6
```

<div id="bech32Encode">
  ## bech32Encode
</div>

Добавленный в: v25.6.0

Кодирует строку двоичных данных вместе с человекочитаемой частью (HRP) с использованием алгоритмов [Bech32 или Bech32m](https://en.bitcoin.it/wiki/Bech32).

<Note>
  При использовании типа данных [`FixedString`](/ru/reference/data-types/fixedstring), если значение не заполняет строку полностью, оно дополняется нулевыми символами.
  Хотя функция `bech32Encode` автоматически обрабатывает это для аргумента hrp, для аргумента data значения не должны содержать такого дополнения.
  По этой причине не рекомендуется использовать тип данных [`FixedString`](/ru/reference/data-types/fixedstring) для значений данных, если только вы не
  уверены, что все они имеют одинаковую длину, и не задали для столбца `FixedString` ту же длину.
</Note>

**Синтаксис**

```sql theme={null}
bech32Encode(hrp, data[, witver | 'bech32' | 'bech32m'])
```

**Аргументы**

* `hrp` — Строка из `1 - 83` строчных символов, задающая "человекочитаемую часть" кода. Обычно это 'bc' или 'tb'. [`String`](/ru/reference/data-types/string) или [`FixedString`](/ru/reference/data-types/fixedstring)
* `data` — Строка двоичных данных для кодирования. [`String`](/ru/reference/data-types/string) или [`FixedString`](/ru/reference/data-types/fixedstring)
* `witver_or_variant` — Необязательно. Либо witness version типа UInt\* (по умолчанию = 1, `0` для Bech32, `1`+ для Bech32m), либо строковый вариант кодирования: `'bech32'` (BIP173) или `'bech32m'` (BIP350). При использовании строкового варианта байт witness version не добавляется в начало — это требуется для адресов, не относящихся к SegWit, например Cosmos SDK. [`UInt*`](/ru/reference/data-types/int-uint) или [`String`](/ru/reference/data-types/string)

**Возвращаемое значение**

Возвращает строку адреса Bech32, состоящую из человекочитаемой части, символа-разделителя, которым всегда является '1', и части данных. Длина строки никогда не превышает 90 символов. Если алгоритм не может сгенерировать корректный адрес из входных данных, возвращается пустая строка. [`String`](/ru/reference/data-types/string)

**Примеры**

**Bech32m по умолчанию**

```sql title=Query theme={null}
-- Если witness version не указана, по умолчанию используется 1 — обновлённый алгоритм Bech32m.
SELECT bech32Encode('bc', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'))
```

```response title=Response theme={null}
bc1w508d6qejxtdg4y5r3zarvary0c5xw7k8zcwmq
```

**Алгоритм Bech32**

```sql title=Query theme={null}
-- Witness version, равный 0, приведёт к другой строке адреса.
SELECT bech32Encode('bc', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 0)
```

```response title=Response theme={null}
bc1w508d6qejxtdg4y5r3zarvary0c5xw7kj7gz7z
```

**Пользовательский HRP**

```sql title=Query theme={null}
-- Хотя 'bc' (Mainnet) и 'tb' (Testnet) — единственные допустимые значения hrp для
-- формата адресов SegWit, Bech32 допускает любой hrp, удовлетворяющий указанным требованиям.
SELECT bech32Encode('abcdefg', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 10)
```

```response title=Response theme={null}
abcdefg1w508d6qejxtdg4y5r3zarvary0c5xw7k9rp8r4
```

**Адрес Cosmos SDK (BIP173, без witness version)**

```sql title=Query theme={null}
-- Вариант 'bech32' кодирует необработанные данные без байта witness version,
-- совместим с Cosmos SDK, Injective, Osmosis и другими цепочками без поддержки SegWit.
SELECT bech32Encode('inj', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 'bech32')
```

```response title=Response theme={null}
inj1w508d6qejxtdg4y5r3zarvary0c5xw7kgj5aqs
```

<div id="bin">
  ## bin
</div>

Добавленный в: v21.8.0

Возвращает строку, содержащую двоичное представление аргумента
согласно следующей логике для разных типов:

| Type                       | Description                                                                                                                                                                                                                                                              |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `(U)Int*`                  | Выводит двоичные цифры от старшего бита к младшему (в порядке big-endian, или в "человекочитаемом" порядке). Начинает со старшего ненулевого байта (начальные нулевые байты опускаются), но для каждого байта всегда выводит восемь цифр, если старшая цифра равна нулю. |
| `Date` and `DateTime`      | Форматируется как соответствующие целые числа (число дней с эпохи Unix для Date и значение Unix-временной метки для DateTime).                                                                                                                                           |
| `String` and `FixedString` | Все байты просто кодируются как восьмибитные двоичные числа. Нулевые байты не опускаются.                                                                                                                                                                                |
| `Float*` and `Decimal`     | Кодируются в виде своего представления в памяти. Поскольку поддерживается архитектура little-endian, они также кодируются в little-endian. Начальные/конечные нулевые байты не опускаются.                                                                               |
| `UUID`                     | Кодируется как строка в порядке big-endian.                                                                                                                                                                                                                              |

**Синтаксис**

```sql theme={null}
bin(arg)
```

**Аргументы**

* `arg` — значение для преобразования в двоичный вид. [`String`](/ru/reference/data-types/string) или [`FixedString`](/ru/reference/data-types/fixedstring) или [`(U)Int*`](/ru/reference/data-types/int-uint) или [`Float*`](/ru/reference/data-types/float) или [`Decimal`](/ru/reference/data-types/decimal) или [`Date`](/ru/reference/data-types/date) или [`DateTime`](/ru/reference/data-types/datetime)

**Возвращаемое значение**

Возвращает строку с двоичным представлением аргумента. [`String`](/ru/reference/data-types/string)

**Примеры**

**Простое целое число**

```sql title=Query theme={null}
SELECT bin(14)
```

```response title=Response theme={null}
┌─bin(14)──┐
│ 00001110 │
└──────────┘
```

**Числа типа Float32**

```sql title=Query theme={null}
SELECT bin(toFloat32(number)) AS bin_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─bin_presentation─────────────────┐
│ 00000000000000000111000001000001 │
│ 00000000000000001000000001000001 │
└──────────────────────────────────┘
```

**Числа типа Float64**

```sql title=Query theme={null}
SELECT bin(toFloat64(number)) AS bin_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─bin_presentation─────────────────────────────────────────────────┐
│ 0000000000000000000000000000000000000000000000000010111001000000 │
│ 0000000000000000000000000000000000000000000000000011000001000000 │
└──────────────────────────────────────────────────────────────────┘
```

**Преобразование UUID**

```sql title=Query theme={null}
SELECT bin(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0')) AS bin_uuid
```

```response title=Response theme={null}
┌─bin_uuid─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 01100001111100001100010000000100010111001011001100010001111001111001000001111011101001100000000001101010110100111101101110100000 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
```

<div id="bitPositionsToArray">
  ## bitPositionsToArray
</div>

Добавленный в: v21.7.0

Эта функция возвращает позиции (в порядке возрастания) битов со значением 1 в двоичном представлении беззнакового целого числа.
Знаковые целые числа на входе сначала приводятся к беззнаковому целому числу.

**Синтаксис**

```sql theme={null}
bitPositionsToArray(arg)
```

**Аргументы**

* `arg` — Целочисленное значение. [`(U)Int*`](/ru/reference/data-types/int-uint)

**Возвращаемое значение**

Возвращает массив позиций битов со значением 1 в двоичном представлении входного значения, упорядоченных по возрастанию. [`Array(UInt64)`](/ru/reference/data-types/array)

**Примеры**

**Установлен только один бит**

```sql title=Query theme={null}
SELECT bitPositionsToArray(toInt8(1)) AS bit_positions
```

```response title=Response theme={null}
┌─bit_positions─┐
│ [0]           │
└───────────────┘
```

**Установлены все биты**

```sql title=Query theme={null}
SELECT bitPositionsToArray(toInt8(-1)) AS bit_positions
```

```response title=Response theme={null}
┌─bit_positions─────────────┐
│ [0, 1, 2, 3, 4, 5, 6, 7]  │
└───────────────────────────┘
```

<div id="bitmaskToArray">
  ## bitmaskToArray
</div>

Добавленный в: v1.1.0

Эта функция раскладывает целое число на сумму степеней двойки.
Степени двойки возвращаются в виде массива, упорядоченного по возрастанию.

**Синтаксис**

```sql theme={null}
bitmaskToArray(num)
```

**Аргументы**

* `num` — Целое число. [`(U)Int*`](/ru/reference/data-types/int-uint)

**Возвращаемое значение**

Возвращает массив степеней двойки, упорядоченных по возрастанию, сумма которых равна входному числу. [`Array(UInt64)`](/ru/reference/data-types/array)

**Примеры**

**Базовый пример**

```sql title=Query theme={null}
SELECT bitmaskToArray(50) AS powers_of_two
```

```response title=Response theme={null}
┌─powers_of_two───┐
│ [2, 16, 32]     │
└─────────────────┘
```

**Одна степень двойки**

```sql title=Query theme={null}
SELECT bitmaskToArray(8) AS powers_of_two
```

```response title=Response theme={null}
┌─powers_of_two─┐
│ [8]           │
└───────────────┘
```

<div id="bitmaskToList">
  ## bitmaskToList
</div>

Добавленный в: v1.1.0

Как и bitmaskToArray, но возвращает степени двойки в виде строки, где значения разделены запятыми.

**Синтаксис**

```sql theme={null}
bitmaskToList(num)
```

**Аргументы**

* `num` — Целое число. [`(U)Int*`](/ru/reference/data-types/int-uint)

**Возвращаемое значение**

Возвращает строку со степенями двойки, разделёнными запятыми. [`String`](/ru/reference/data-types/string)

**Примеры**

**Базовый пример**

```sql title=Query theme={null}
SELECT bitmaskToList(50) AS powers_list
```

```response title=Response theme={null}
┌─powers_list───┐
│ 2, 16, 32     │
└───────────────┘
```

<div id="char">
  ## char
</div>

Добавленный в: v20.1.0

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

Если значение аргумента выходит за пределы диапазона типа данных `UInt8`, оно преобразуется
в `UInt8` с возможным округлением и переполнением.

**Синтаксис**

```sql theme={null}
char(num1[, num2[, ...]])
```

**Аргументы**

* `num1[, num2[, num3 ...]]` — Числовые аргументы, интерпретируемые как целые числа. [`(U)Int8/16/32/64`](/ru/reference/data-types/int-uint) или [`Float*`](/ru/reference/data-types/float)

**Возвращаемое значение**

Возвращает строку из заданных байтов. [`String`](/ru/reference/data-types/string)

**Примеры**

**Базовый пример**

```sql title=Query theme={null}
SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello;
```

```response title=Response theme={null}
┌─hello─┐
│ hello │
└───────┘
```

**Создание произвольных кодировок**

```sql title=Query theme={null}
-- Можно построить строку произвольной кодировки, передав соответствующие байты.
-- например UTF8
SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello;
```

```response title=Response theme={null}
┌─hello──┐
│ привет │
└────────┘
```

<div id="hex">
  ## hex
</div>

Добавленный в: v1.1.0

Возвращает строку, содержащую шестнадцатеричное представление аргумента
в соответствии со следующей логикой для разных типов:

| Тип                        | Описание                                                                                                                                                                                                                                                                         |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `(U)Int*`                  | Выводит шестнадцатеричные цифры ("полубайты") от старшего к младшему разряду (big-endian, или в "человекочитаемом" порядке). Начинает со старшего ненулевого байта (ведущие нулевые байты опускаются), но всегда выводит обе цифры каждого байта, даже если первая цифра — ноль. |
| `Date` and `DateTime`      | Форматируются как соответствующие целые числа (число дней с эпохи Unix для Date и значение Unix-временной метки для DateTime).                                                                                                                                                   |
| `String` and `FixedString` | Каждый байт просто кодируется двумя шестнадцатеричными цифрами. Нулевые байты не опускаются.                                                                                                                                                                                     |
| `Float*` and `Decimal`     | Кодируются в виде их представления в памяти. ClickHouse всегда хранит значения внутри в формате little-endian, поэтому они кодируются именно так. Ведущие/конечные нулевые байты не опускаются.                                                                                  |
| `UUID`                     | Кодируется как строка в порядке байтов big-endian.                                                                                                                                                                                                                               |

Функция использует заглавные буквы `A-F` и не использует никаких префиксов (например, `0x`) или суффиксов (например, `h`).

**Синтаксис**

```sql theme={null}
hex(arg)
```

**Аргументы**

* `arg` — значение для преобразования в шестнадцатеричное представление. [`String`](/ru/reference/data-types/string) или [`(U)Int*`](/ru/reference/data-types/int-uint) или [`Float*`](/ru/reference/data-types/float) или [`Decimal`](/ru/reference/data-types/decimal) или [`Date`](/ru/reference/data-types/date) или [`DateTime`](/ru/reference/data-types/datetime)

**Возвращаемое значение**

Строка с шестнадцатеричным представлением аргумента. [`String`](/ru/reference/data-types/string)

**Примеры**

**Простое целое число**

```sql title=Query theme={null}
SELECT hex(1)
```

```response title=Response theme={null}
01
```

**Числа типа Float32**

```sql title=Query theme={null}
SELECT hex(toFloat32(number)) AS hex_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─hex_presentation─┐
│ 00007041         │
│ 00008041         │
└──────────────────┘
```

**Числа типа Float64**

```sql title=Query theme={null}
SELECT hex(toFloat64(number)) AS hex_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─hex_presentation─┐
│ 0000000000002E40 │
│ 0000000000003040 │
└──────────────────┘
```

**Преобразование UUID**

```sql title=Query theme={null}
SELECT lower(hex(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0'))) AS uuid_hex
```

```response title=Response theme={null}
┌─uuid_hex─────────────────────────┐
│ 61f0c4045cb311e7907ba6006ad3dba0 │
└──────────────────────────────────┘
```

<div id="hilbertDecode">
  ## hilbertDecode
</div>

Добавленный в: v24.6.0

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

Как и функция `hilbertEncode`, эта функция поддерживает два режима работы:

* **Простой**
* **Расширенный**

**Простой режим**

Принимает до 2 беззнаковых целых чисел в качестве аргументов и возвращает код `UInt64`.

**Расширенный режим**

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

Расширение диапазона может быть полезно, когда нужно получить схожее распределение для
аргументов с сильно различающимися диапазонами (или мощностью). Например: 'IP-адрес' `(0...FFFFFFFF)`
и 'код страны' `(0...FF)`. Как и в случае с функцией кодирования, здесь можно указать не более 8
чисел.

**Синтаксис**

```sql theme={null}
hilbertDecode(tuple_size, code)
```

**Аргументы**

* `tuple_size` — целочисленное значение не более `2`. [`UInt8/16/32/64`](/ru/reference/data-types/int-uint) или [`Tuple(UInt8/16/32/64)`](/ru/reference/data-types/tuple)
* `code` — код `UInt64`. [`UInt64`](/ru/reference/data-types/int-uint)

**Возвращаемое значение**

Возвращает кортеж указанного размера. [`Tuple(UInt64)`](/ru/reference/data-types/tuple)

**Примеры**

**Простой режим**

```sql title=Query theme={null}
SELECT hilbertDecode(2, 31)
```

```response title=Response theme={null}
["3", "4"]
```

**Один аргумент**

```sql title=Query theme={null}
-- Код Гильберта для одного аргумента всегда равен самому аргументу (в виде кортежа).
SELECT hilbertDecode(1, 1)
```

```response title=Response theme={null}
["1"]
```

**Расширенный режим**

```sql title=Query theme={null}
-- Одиночный аргумент с кортежем, задающим битовые сдвиги, будет сдвинут вправо соответствующим образом.
SELECT hilbertDecode(tuple(2), 32768)
```

```response title=Response theme={null}
["128"]
```

**Работа со столбцами**

```sql title=Query theme={null}
-- Сначала создайте таблицу и вставьте данные
CREATE TABLE hilbert_numbers(
    n1 UInt32,
    n2 UInt32
)
ENGINE=MergeTree()
ORDER BY n1 SETTINGS index_granularity_bytes = '10Mi';
insert into hilbert_numbers (*) values(1,2);

-- Используйте имена столбцов вместо констант в качестве аргументов функции
SELECT untuple(hilbertDecode(2, hilbertEncode(n1, n2))) FROM hilbert_numbers;
```

```response title=Response theme={null}
1    2
```

<div id="hilbertEncode">
  ## hilbertEncode
</div>

Добавленный в: v24.6.0

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

У функции есть два режима работы:

* **Простой**
* **Расширенный**

**Простой режим**

Принимает до 2 беззнаковых целых чисел в качестве аргументов и возвращает код UInt64.

**Расширенный режим**

Принимает маску диапазона ([Tuple](/ru/reference/data-types/tuple)) в качестве
первого аргумента и до 2 [беззнаковых целых чисел](/ru/reference/data-types/int-uint)
в качестве остальных аргументов.

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

**Синтаксис**

```sql theme={null}
-- Упрощённый режим
hilbertEncode(args)

-- Расширенный режим
hilbertEncode(range_mask, args)
```

**Аргументы**

* `args` — До двух значений `UInt` или столбцов типа `UInt`. [`UInt8/16/32/64`](/ru/reference/data-types/int-uint)
* `range_mask` — В расширенном режиме: до двух значений `UInt` или столбцов типа `UInt`. [`UInt8/16/32/64`](/ru/reference/data-types/int-uint)

**Возвращаемое значение**

Возвращает код типа `UInt64`. [`UInt64`](/ru/reference/data-types/int-uint)

**Примеры**

**Простой режим**

```sql title=Query theme={null}
SELECT hilbertEncode(3, 4)
```

```response title=Response theme={null}
31
```

**Расширенный режим**

```sql title=Query theme={null}
-- Расширение диапазона полезно, когда нужно схожее распределение для
-- аргументов с существенно различающимися диапазонами (или мощностью).
-- Например: 'IP-адрес' (0...FFFFFFFF) и 'Код страны' (0...FF).
-- Примечание: размер кортежа должен совпадать с количеством остальных аргументов.
SELECT hilbertEncode((10, 6), 1024, 16)
```

```response title=Response theme={null}
4031541586602
```

**Один аргумент**

```sql title=Query theme={null}
-- Для одного аргумента без кортежа функция возвращает сам аргумент
-- в качестве индекса Гильберта, так как размерное отображение не требуется.
SELECT hilbertEncode(1)
```

```response title=Response theme={null}
1
```

**Расширенный вариант с одним аргументом**

```sql title=Query theme={null}
-- Если передан один аргумент с кортежем, задающим битовые сдвиги, функция
-- сдвигает аргумент влево на указанное количество битов.
SELECT hilbertEncode(tuple(2), 128)
```

```response title=Response theme={null}
512
```

**Использование столбцов**

```sql title=Query theme={null}
-- Сначала создайте таблицу и вставьте данные
CREATE TABLE hilbert_numbers(
    n1 UInt32,
    n2 UInt32
)
ENGINE=MergeTree()
ORDER BY n1;
insert into hilbert_numbers (*) values(1, 2);

-- Используйте имена столбцов вместо констант в качестве аргументов функции
SELECT hilbertEncode(n1, n2) FROM hilbert_numbers;
```

```response title=Response theme={null}
13
```

<div id="mortonDecode">
  ## mortonDecode
</div>

Добавленный в: v24.6.0

Декодирует кодировку Morton (ZCurve) в соответствующий кортеж беззнаковых целых чисел.

Как и функция `mortonEncode`, эта функция имеет два режима работы:

* **Простой**
* **Расширенный**

**Простой режим**

Принимает размер результирующего кортежа в качестве первого аргумента, а код — в качестве второго.

**Расширенный режим**

Принимает маску диапазона (кортеж) в качестве первого аргумента, а код — в качестве второго.
Каждое число в маске задаёт степень сужения диапазона:

* `1` - без сужения
* `2` - сужение в 2 раза
* `3` - сужение в 3 раза
  ⋮
* До 8-кратного сужения.

Расширение диапазонов может быть полезно, если нужно получить схожее распределение для
аргументов с сильно различающимися диапазонами (или мощностью). Например: 'IP Address' `(0...FFFFFFFF)`
и 'Country code' `(0...FF)`. Как и в случае с функцией кодирования, число таких значений ограничено
максимум 8.

**Синтаксис**

```sql theme={null}
-- Простой режим
mortonDecode(tuple_size, code)

-- Расширенный режим
mortonDecode(range_mask, code)
```

**Аргументы**

* `tuple_size` — Целочисленное значение не более 8. [`UInt8/16/32/64`](/ru/reference/data-types/int-uint)
* `range_mask` — Для расширенного режима: маска для каждого аргумента. Маска представляет собой кортеж беззнаковых целых чисел. Каждое число в маске задаёт степень сужения диапазона. [`Tuple(UInt8/16/32/64)`](/ru/reference/data-types/tuple)
* `code` — Код типа UInt64. [`UInt64`](/ru/reference/data-types/int-uint)

**Возвращаемое значение**

Возвращает кортеж указанного размера. [`Tuple(UInt64)`](/ru/reference/data-types/tuple)

**Примеры**

**Простой режим**

```sql title=Query theme={null}
SELECT mortonDecode(3, 53)
```

```response title=Response theme={null}
["1", "2", "3"]
```

**Один аргумент**

```sql title=Query theme={null}
SELECT mortonDecode(1, 1)
```

```response title=Response theme={null}
["1"]
```

**Расширенный режим, с сужением одного аргумента**

```sql title=Query theme={null}
SELECT mortonDecode(tuple(2), 32768)
```

```response title=Response theme={null}
["128"]
```

**Использование столбцов**

```sql title=Query theme={null}
-- Сначала создаём таблицу и вставляем данные
CREATE TABLE morton_numbers(
    n1 UInt32,
    n2 UInt32,
    n3 UInt16,
    n4 UInt16,
    n5 UInt8,
    n6 UInt8,
    n7 UInt8,
    n8 UInt8
)
ENGINE=MergeTree()
ORDER BY n1;
INSERT INTO morton_numbers (*) values(1, 2, 3, 4, 5, 6, 7, 8);

-- Используем имена столбцов вместо констант в качестве аргументов функции
SELECT untuple(mortonDecode(8, mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8))) FROM morton_numbers;
```

```response title=Response theme={null}
1 2 3 4 5 6 7 8
```

<div id="mortonEncode">
  ## mortonEncode
</div>

Добавленный в: v24.6.0

Вычисляет кодирование Morton (ZCurve) для списка беззнаковых целых чисел.

У функции есть два режима работы:

* **Простой**
* *Расширенный*\*

**Простой режим**

Принимает до 8 беззнаковых целых чисел в качестве аргументов и возвращает код `UInt64`.

**Расширенный режим**

Принимает маску диапазона ([Tuple](/ru/reference/data-types/tuple)) в качестве первого аргумента и
до 8 [беззнаковых целых чисел](/ru/reference/data-types/int-uint) в качестве остальных аргументов.

Каждое число в маске задаёт величину расширения диапазона:

* 1 - без расширения
* 2 - расширение в 2 раза
* 3 - расширение в 3 раза
  ⋮
* До 8-кратного расширения.

**Синтаксис**

```sql theme={null}
-- Упрощённый режим
mortonEncode(args)

-- Расширенный режим
mortonEncode(range_mask, args)
```

**Аргументы**

* `args` — До 8 беззнаковых целых чисел или столбцов указанного выше типа. [`UInt8/16/32/64`](/ru/reference/data-types/int-uint)
* `range_mask` — Для расширенного режима: маска для каждого аргумента. Маска представляет собой кортеж беззнаковых целых чисел от `1` до `8`. Каждое число в маске задаёт степень сужения диапазона. [`Tuple(UInt8/16/32/64)`](/ru/reference/data-types/tuple)

**Возвращаемое значение**

Возвращает код `UInt64`. [`UInt64`](/ru/reference/data-types/int-uint)

**Примеры**

**Простой режим**

```sql title=Query theme={null}
SELECT mortonEncode(1, 2, 3)
```

```response title=Response theme={null}
53
```

**Расширенный режим**

```sql title=Query theme={null}
-- Расширение диапазона полезно, когда требуется схожее распределение для
-- аргументов с существенно различающимися диапазонами (или мощностью)
-- Например: 'IP-адрес' (0...FFFFFFFF) и 'Код страны' (0...FF).
-- Примечание: размер Tuple должен быть равен количеству остальных аргументов.
SELECT mortonEncode((1,2), 1024, 16)
```

```response title=Response theme={null}
1572864
```

**Один аргумент**

```sql title=Query theme={null}
-- Кодирование Мортона для одного аргумента всегда равно самому аргументу
SELECT mortonEncode(1)
```

```response title=Response theme={null}
1
```

**Расширенный режим с одним аргументом**

```sql title=Query theme={null}
SELECT mortonEncode(tuple(2), 128)
```

```response title=Response theme={null}
32768
```

**Использование со столбцами**

```sql title=Query theme={null}
-- Сначала создайте таблицу и вставьте данные
CREATE TABLE morton_numbers(
    n1 UInt32,
    n2 UInt32,
    n3 UInt16,
    n4 UInt16,
    n5 UInt8,
    n6 UInt8,
    n7 UInt8,
    n8 UInt8
)
ENGINE=MergeTree()
ORDER BY n1;
INSERT INTO morton_numbers (*) values(1, 2, 3, 4, 5, 6, 7, 8);

-- Используйте имена столбцов вместо констант в качестве аргументов функции
SELECT mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8) FROM morton_numbers;
```

```response title=Response theme={null}
2155374165
```

<div id="sqidDecode">
  ## sqidDecode
</div>

Добавленный в: v24.1.0

Преобразует [sqid](https://sqids.org/) обратно в массив чисел.

**Синтаксис**

```sql theme={null}
sqidDecode(sqid)
```

**Аргументы**

* `sqid` — `sqid`, который нужно декодировать. [`String`](/ru/reference/data-types/string)

**Возвращаемое значение**

Возвращает массив чисел, полученных из `sqid`. [`Array(UInt64)`](/ru/reference/data-types/array)

**Примеры**

**Пример использования**

```sql title=Query theme={null}
SELECT sqidDecode('gXHfJ1C6dN');
```

```response title=Response theme={null}
┌─sqidDecode('gXHfJ1C6dN')─────┐
│ [1, 2, 3, 4, 5]              │
└──────────────────────────────┘
```

<div id="sqidEncode">
  ## sqidEncode
</div>

Добавленный в: v24.1.0

Преобразует числа в [sqid](https://sqids.org/) — строковый идентификатор в стиле YouTube.

**Синтаксис**

```sql theme={null}
sqidEncode(n1[, n2, ...])
```

**Псевдонимы**: `sqid`

**Аргументы**

* `n1[, n2, ...]` — Произвольное количество чисел. [`UInt8/16/32/64`](/ru/reference/data-types/int-uint)

**Возвращаемое значение**

Возвращает хеш-идентификатор в виде [`String`](/ru/reference/data-types/string)

**Примеры**

**Пример использования**

```sql title=Query theme={null}
SELECT sqidEncode(1, 2, 3, 4, 5);
```

```response title=Response theme={null}
┌─sqidEncode(1, 2, 3, 4, 5)─┐
│ gXHfJ1C6dN                │
└───────────────────────────┘
```

<div id="unbin">
  ## unbin
</div>

Добавленный в: v21.8.0

Интерпретирует каждую пару двоичных цифр (в аргументе) как число и преобразует её в байт, представленный этим числом. Функция выполняет операцию, обратную `bin`.

Для числового аргумента `unbin()` не возвращает результат, обратный `bin()`. Если вы хотите преобразовать результат в число, можно использовать функции reverse и `reinterpretAs<Type>`.

<Note>
  Если `unbin` вызывается из `clickhouse-client`, двоичные строки отображаются в UTF-8.
</Note>

Поддерживаются двоичные цифры `0` и `1`. Количество двоичных цифр не обязательно должно быть кратно восьми. Если строковый аргумент содержит что-либо, кроме двоичных цифр,
результат не определён (исключение не генерируется).

**Синтаксис**

```sql theme={null}
unbin(arg)
```

**Аргументы**

* `arg` — Строка, содержащая произвольное количество двоичных цифр. [`String`](/ru/reference/data-types/string)

**Возвращаемое значение**

Возвращает двоичную строку (BLOB). [`String`](/ru/reference/data-types/string)

**Примеры**

**Базовое использование**

```sql title=Query theme={null}
SELECT UNBIN('001100000011000100110010'), UNBIN('0100110101111001010100110101000101001100')
```

```response title=Response theme={null}
┌─unbin('001100000011000100110010')─┬─unbin('0100110101111001010100110101000101001100')─┐
│ 012                               │ MySQL                                             │
└───────────────────────────────────┴───────────────────────────────────────────────────┘
```

**Преобразовать в число**

```sql title=Query theme={null}
SELECT reinterpretAsUInt64(reverse(unbin('1110'))) AS num
```

```response title=Response theme={null}
┌─num─┐
│  14 │
└─────┘
```

<div id="unhex">
  ## unhex
</div>

Добавленный в: v1.1.0

Выполняет операцию, обратную [`hex`](#hex). Интерпретирует каждую пару шестнадцатеричных цифр (в аргументе) как число и преобразует
её в байт, соответствующий этому числу. Возвращаемое значение — двоичная строка (BLOB).

Если вы хотите преобразовать результат в число, можно использовать функции `reverse` и `reinterpretAs<Type>`.

<Note>
  `clickhouse-client` интерпретирует строки как UTF-8.
  Из-за этого значения, возвращаемые `hex`, могут отображаться неожиданно.
</Note>

Поддерживаются как прописные, так и строчные буквы `A-F`.
Количество шестнадцатеричных цифр не обязательно должно быть чётным.
Если оно нечётное, последняя цифра интерпретируется как младшая половина байта `00-0F`.
Если строка аргумента содержит символы, отличные от шестнадцатеричных цифр, возвращается некоторый зависящий от реализации результат (исключение не генерируется).
Для числового аргумента обратное преобразование hex(N) с помощью unhex() не выполняется.

**Синтаксис**

```sql theme={null}
unhex(arg)
```

**Аргументы**

* `arg` — Строка, содержащая произвольное количество шестнадцатеричных цифр. [`String`](/ru/reference/data-types/string) или [`FixedString`](/ru/reference/data-types/fixedstring)

**Возвращаемое значение**

Возвращает двоичную строку (BLOB). [`String`](/ru/reference/data-types/string)

**Примеры**

**Базовое использование**

```sql title=Query theme={null}
SELECT unhex('303132'), UNHEX('4D7953514C')
```

```response title=Response theme={null}
┌─unhex('303132')─┬─unhex('4D7953514C')─┐
│ 012             │ MySQL               │
└─────────────────┴─────────────────────┘
```

**Преобразовать в число**

```sql title=Query theme={null}
SELECT reinterpretAsUInt64(reverse(unhex('FFF'))) AS num
```

```response title=Response theme={null}
┌──num─┐
│ 4095 │
└──────┘
```
