ClickHouse/docs/ru/query_language/functions/encoding_functions.md
2020-02-02 05:59:35 +03:00

149 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Функции кодирования
## 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/) <!--hide-->