# Функции кодирования ## char {#char} Возвращает строку, длина которой равна числу переданных аргументов, и каждый байт имеет значение соответствующего аргумента. Принимает несколько числовых аргументов. Если значение аргумента выходит за диапазон UInt8 (0..255), то оно преобразуется в UInt8 с возможным округлением и переполнением. **Синтаксис** ```sql char(number_1, [number_2, ..., number_n]); ``` **Параметры** - `number_1, number_2, ..., number_n` — Числовые аргументы, которые интерпретируются как целые числа. Типы: [Int](../../data_types/int_uint.md), [Float](../../data_types/float.md). **Возвращаемое значение** - строка из соответствующих байт. Тип: `String`. **Пример** Запрос: ```sql SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello ``` Ответ: ```text ┌─hello─┐ │ hello │ └───────┘ ``` Вы можете создать строку в произвольной кодировке, передав соответствующие байты. Пример для UTF-8: Запрос: ```sql SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello; ``` Ответ: ```text ┌─hello──┐ │ привет │ └────────┘ ``` Запрос: ```sql SELECT char(0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD) AS hello; ``` Ответ: ```text ┌─hello─┐ │ 你好 │ └───────┘ ``` ## hex {#hex} Возвращает строку, содержащую шестнадцатеричное представление аргумента. **Syntax** ```sql hex(arg) ``` Результат зависит от типа передаваемого аргумента. Используйте заглавные буквы `A-F`. Не используйте префиксы `0x` и суффиксы `h`. Для строк просто все байты кодируются в виде двух шестнадцатеричных цифр. Числа преобразуются в человекочитаемый (big endian) формат. Для чисел вырезаются старшие нули, но только по целым байтам. Например: - `Date` кодируется как число дней с начала Unix-эпохи. - `DateTime` кодируются как число секунд с начала Unix-эпохи. - `Float` и `Decimal` кодируются как их шестнадцатеричное представление в памяти. **Параметры** - `arg` — Значение для преобразования в шестнадцатеричное. Типы: [String](../../data_types/string.md), [UInt](../../data_types/int_uint.md), [Float](../../data_types/float.md), [Decimal](../../data_types/decimal.md), [Date](../../data_types/date.md) or [DateTime](../../data_types/datetime.md). **Влзвращаемое значение** - Строковое шестнадцатеричное представление переданного аргумента. Тип: `String`. **Пример** Запрос: ```sql SELECT hex(toFloat32(number)) as hex_presentation FROM numbers(15, 2); ``` Ответ: ```text ┌─hex_presentation─┐ │ 00007041 │ │ 00008041 │ └──────────────────┘ ``` Запрос: ```sql SELECT hex(toFloat64(number)) as hex_presentation FROM numbers(15, 2); ``` Ответ: ```text ┌─hex_presentation─┐ │ 0000000000002E40 │ │ 0000000000003040 │ └──────────────────┘ ``` ## unhex(str) Принимает строку, содержащую произвольное количество шестнадцатеричных цифр, и возвращает строку, содержащую соответствующие байты. Поддерживаются как строчные, так и заглавные буквы A-F. Число шестнадцатеричных цифр не обязано быть чётным. Если оно нечётное - последняя цифра интерпретируется как младшая половинка байта 00-0F. Если строка-аргумент содержит что-либо кроме шестнадцатеричных цифр, то будет возвращён какой-либо implementation-defined результат (не кидается исключение). Если вы хотите преобразовать результат в число, то вы можете использовать функции reverse и reinterpretAsType. ## UUIDStringToNum(str) Принимает строку, содержащую 36 символов в формате `123e4567-e89b-12d3-a456-426655440000`, и возвращает в виде набора байт в FixedString(16). ## UUIDNumToString(str) Принимает значение типа FixedString(16). Возвращает строку из 36 символов в текстовом виде. ## bitmaskToList(num) Принимает целое число. Возвращает строку, содержащую список степеней двойки, в сумме дающих исходное число; по возрастанию, в текстовом виде, через запятую, без пробелов. ## bitmaskToArray(num) Принимает целое число. Возвращает массив чисел типа UInt64, содержащий степени двойки, в сумме дающих исходное число; числа в массиве идут по возрастанию. [Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/functions/encoding_functions/)