2020-10-26 10:29:30 +00:00
---
toc_priority: 40
2021-03-08 14:54:44 +00:00
toc_title: "Функции для работы с о строками"
2020-10-26 10:29:30 +00:00
---
2020-03-20 18:20:59 +00:00
# Функции для работы с о строками {#funktsii-dlia-raboty-so-strokami}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## empty {#empty}
2017-03-12 17:58:51 +00:00
Возвращает 1 для пустой строки, и 0 для непустой строки.
2020-03-19 15:32:53 +00:00
Тип результата — UInt8.
2017-03-12 17:58:51 +00:00
Строка считается непустой, если содержит хотя бы один байт, пусть даже это пробел или нулевой байт.
Функция также работает для массивов.
2020-03-19 15:32:53 +00:00
## notEmpty {#notempty}
2017-03-12 17:58:51 +00:00
Возвращает 0 для пустой строки, и 1 для непустой строки.
2020-03-19 15:32:53 +00:00
Тип результата — UInt8.
2017-03-12 17:58:51 +00:00
Функция также работает для массивов.
2020-03-19 15:32:53 +00:00
## length {#length}
2017-03-12 17:58:51 +00:00
Возвращает длину строки в байтах (не символах, не кодовых точках).
2020-03-19 15:32:53 +00:00
Тип результата — UInt64.
2017-03-12 17:58:51 +00:00
Функция также работает для массивов.
2020-03-19 15:32:53 +00:00
## lengthUTF8 {#lengthutf8}
Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, то возвращает какой-нибудь результат (не кидает исключение).
Тип результата — UInt64.
2020-10-13 17:23:29 +00:00
## char_length, CHAR_LENGTH {#char-length}
2020-03-19 15:32:53 +00:00
Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, возвращает какой-нибудь результат (не кидает исключение).
Тип результата — UInt64.
2020-10-13 17:23:29 +00:00
## character_length, CHARACTER_LENGTH {#character-length}
2020-03-19 15:32:53 +00:00
Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, возвращает какой-нибудь результат (не кидает исключение).
Тип результата — UInt64.
## lower, lcase {#lower}
2017-03-12 17:58:51 +00:00
Переводит ASCII-символы латиницы в строке в нижний регистр.
2020-03-19 15:32:53 +00:00
## upper, ucase {#upper}
2017-03-12 17:58:51 +00:00
Переводит ASCII-символы латиницы в строке в верхний регистр.
2020-03-19 15:32:53 +00:00
## lowerUTF8 {#lowerutf8}
Переводит строку в нижний регистр, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8.
2017-03-12 17:58:51 +00:00
Н е учитывает язык. Т о есть, для турецкого языка, результат может быть не совсем верным.
2020-03-19 15:32:53 +00:00
Если длина UTF-8 последовательности байтов различна для верхнего и нижнего регистра кодовой точки, то для этой кодовой точки результат работы может быть некорректным.
Если строка содержит набор байтов, не являющийся UTF-8, то поведение не определено.
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## upperUTF8 {#upperutf8}
Переводит строку в верхний регистр, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8.
2017-03-12 17:58:51 +00:00
Н е учитывает язык. Т о есть, для турецкого языка, результат может быть не совсем верным.
2020-03-19 15:32:53 +00:00
Если длина UTF-8 последовательности байтов различна для верхнего и нижнего регистра кодовой точки, то для этой кодовой точки, результат работы может быть некорректным.
Если строка содержит набор байтов, не являющийся UTF-8, то поведение не определено.
## isValidUTF8 {#isvalidutf8}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
Возвращает 1, если набор байтов является корректным в кодировке UTF-8, 0 иначе.
2019-04-07 18:58:13 +00:00
2020-03-19 15:32:53 +00:00
## toValidUTF8 {#tovalidutf8}
2019-05-20 14:41:10 +00:00
Заменяет некорректные символы UTF-8 на символ `<60> ` (U+FFFD). В с е идущие подряд некорректные символы схлопываются в один заменяющий символ.
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
toValidUTF8(input_string)
2019-05-20 14:41:10 +00:00
```
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-05-20 14:41:10 +00:00
2021-03-13 18:18:45 +00:00
- `input_string` — произвольный набор байтов, представленный как объект типа [String ](../../sql-reference/functions/string-functions.md ).
2019-05-20 14:41:10 +00:00
Возвращаемое значение: Корректная строка UTF-8.
2020-03-19 15:32:53 +00:00
**Пример**
2019-05-20 14:41:10 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT toValidUTF8('\x61\xF0\x80\x80\x80b');
2019-05-20 14:41:10 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-05-23 12:42:12 +00:00
┌─toValidUTF8('a<> <61> <EFBFBD> <EFBFBD> b')─┐
│ a<> b │
└───────────────────────┘
2019-05-20 14:41:10 +00:00
```
2019-10-24 14:59:00 +00:00
## repeat {#repeat}
Повторяет строку определенное количество раз и объединяет повторяемые значения в одну строку.
2021-02-16 11:31:24 +00:00
Синоним: `REPEAT` .
2019-10-24 14:59:00 +00:00
**Синтаксис**
2020-03-20 18:20:59 +00:00
``` sql
2019-10-24 14:59:00 +00:00
repeat(s, n)
```
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-10-24 14:59:00 +00:00
2021-03-13 18:18:45 +00:00
- `s` — строка для повторения. [String ](../../sql-reference/functions/string-functions.md ).
- `n` — количество повторов. [UInt ](../../sql-reference/functions/string-functions.md ).
2019-10-24 14:59:00 +00:00
**Возвращаемое значение**
2020-03-20 18:20:59 +00:00
Строка, состоящая из повторений `n` раз исходной строки `s` . Если `n` \< 1, то функция вернет пустую строку.
2019-10-24 14:59:00 +00:00
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT repeat('abc', 10);
2019-10-24 14:59:00 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-10-24 14:59:00 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-10-24 14:59:00 +00:00
┌─repeat('abc', 10)──────────────┐
│ abcabcabcabcabcabcabcabcabcabc │
└────────────────────────────────┘
```
2019-05-20 14:41:10 +00:00
2020-03-19 15:32:53 +00:00
## reverse {#reverse}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
Разворачивает строку (как последовательность байтов).
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## reverseUTF8 {#reverseutf8}
2019-05-18 11:30:36 +00:00
2020-03-19 15:32:53 +00:00
Разворачивает последовательность кодовых точек Unicode, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Иначе — что-то делает (не кидает исключение).
2019-05-18 11:30:36 +00:00
2020-03-20 18:20:59 +00:00
## format(pattern, s0, s1, …) {#format}
2020-03-19 15:32:53 +00:00
2020-03-20 18:20:59 +00:00
Форматирует константный шаблон с о строками, перечисленными в аргументах. `pattern` — упрощенная версия шаблона в языке Python. Шаблон содержит «заменяющие поля», которые окружены фигурными скобками `{}` . Всё, что не содержится в скобках, интерпретируется как обычный текст и просто копируется. Если нужно использовать символ фигурной скобки, можно экранировать двойной скобкой `{{ '{{' }}` или `{{ '}}' }}` . Имя полей могут быть числами (нумерация с нуля) или пустыми (тогда они интерпретируются как последовательные числа).
2019-05-18 11:30:36 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-05-18 11:30:36 +00:00
SELECT format('{1} {0} {1}', 'World', 'Hello')
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-05-18 11:30:36 +00:00
┌─format('{1} {0} {1}', 'World', 'Hello')─┐
│ Hello World Hello │
└─────────────────────────────────────────┘
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` sql
2019-05-18 11:30:36 +00:00
SELECT format('{} {}', 'Hello', 'World')
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-05-18 11:30:36 +00:00
┌─format('{} {}', 'Hello', 'World')─┐
│ Hello World │
└───────────────────────────────────┘
```
2020-03-19 15:32:53 +00:00
## concat {#concat}
2019-05-18 11:30:36 +00:00
2020-03-19 15:32:53 +00:00
Склеивает строки, переданные в аргументы, в одну строку без разделителей.
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
**Cинта кс ис **
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-11-11 14:46:08 +00:00
concat(s1, s2, ...)
```
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-11-11 14:46:08 +00:00
2020-02-02 22:01:57 +00:00
Значения типа String или FixedString.
2019-11-11 14:46:08 +00:00
2020-02-02 22:01:57 +00:00
**Возвращаемое значение**
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
Возвращает строку, полученную в результате склейки аргументов.
2019-11-11 14:46:08 +00:00
2019-12-26 12:51:48 +00:00
Если любой из аргументов имеет значение `NULL` , `concat` возвращает значение `NULL` .
2019-11-11 14:46:08 +00:00
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT concat('Hello, ', 'World!');
2019-11-11 14:46:08 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-12-26 12:51:48 +00:00
┌─concat('Hello, ', 'World!')─┐
│ Hello, World! │
└─────────────────────────────┘
2019-11-11 14:46:08 +00:00
```
## concatAssumeInjective {#concatassumeinjective}
2020-02-02 22:01:57 +00:00
Аналогична [concat ](#concat ). Разница заключается в том, что вам нужно убедиться, что `concat(s1, s2, ...) → sn` является инъективным, так как это предположение будет использоваться для оптимизации GROUP BY.
2020-03-20 18:20:59 +00:00
Функция называется «инъективной», если она возвращает разные значения для разных аргументов. Или, иными словами, функция никогда не выдаёт одно и то же значение, если аргументы разные.
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-11-11 14:46:08 +00:00
concatAssumeInjective(s1, s2, ...)
```
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-11-11 14:46:08 +00:00
2020-02-02 22:01:57 +00:00
Значения типа String или FixedString.
2019-11-11 14:46:08 +00:00
**Возвращаемые значения**
2020-03-20 18:20:59 +00:00
Возвращает строку, полученную в результате объединения аргументов.
2019-11-11 14:46:08 +00:00
2019-12-26 12:51:48 +00:00
Если любой из аргументов имеет значение `NULL` , `concatAssumeInjective` возвращает значение `NULL` .
2019-11-11 14:46:08 +00:00
**Пример**
2019-12-26 12:51:48 +00:00
Вводная таблица:
2020-03-20 18:20:59 +00:00
``` sql
2019-12-26 12:51:48 +00:00
CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog
INSERT INTO key_val VALUES ('Hello, ','World',1)('Hello, ','World',2)('Hello, ','World!',3)('Hello',', World!',2)
SELECT * from key_val
```
2020-03-20 18:20:59 +00:00
``` text
2019-12-26 12:51:48 +00:00
┌─key1────┬─key2─────┬─value─┐
│ Hello, │ World │ 1 │
│ Hello, │ World │ 2 │
│ Hello, │ World! │ 3 │
│ Hello │ , World! │ 2 │
└─────────┴──────────┴───────┘
```
2019-11-11 14:46:08 +00:00
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY (key1, key2);
2019-11-11 14:46:08 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-11-11 14:46:08 +00:00
┌─concat(key1, key2)─┬─sum(value)─┐
│ Hello, World! │ 3 │
│ Hello, World! │ 2 │
│ Hello, World │ 3 │
└────────────────────┴────────────┘
```
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## substring(s, offset, length), mid(s, offset, length), substr(s, offset, length) {#substring}
Возвращает подстроку, начиная с байта по индексу offset, длины length байт. Индексация символов — начиная с единицы (как в стандартном SQL). Аргументы offset и length должны быть константами.
## substringUTF8(s, offset, length) {#substringutf8}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
Так же, как substring, но для кодовых точек Unicode. Работает при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Если допущение не выполнено, то возвращает какой-нибудь результат (не кидает исключение).
## appendTrailingCharIfAbsent(s, c) {#appendtrailingcharifabsent}
2017-03-12 17:58:51 +00:00
Если строка s непустая и не содержит символ c на конце, то добавляет символ c в конец.
2020-03-19 15:32:53 +00:00
## convertCharset(s, from, to) {#convertcharset}
2017-03-12 17:58:51 +00:00
Возвращает сконвертированную из кодировки from в кодировку to строку s.
2018-11-02 19:06:05 +00:00
2020-03-19 15:32:53 +00:00
## base64Encode(s) {#base64encode}
2018-11-02 19:06:05 +00:00
Производит кодирование строки s в base64-представление.
2021-02-16 11:13:01 +00:00
Синоним: `TO_BASE64` .
2020-03-19 15:32:53 +00:00
## base64Decode(s) {#base64decode}
2018-11-02 19:06:05 +00:00
Декодирует base64-представление s в исходную строку. При невозможности декодирования выбрасывает исключение
2021-02-16 11:13:01 +00:00
Синоним: `FROM_BASE64` .
2020-03-19 15:32:53 +00:00
## tryBase64Decode(s) {#trybase64decode}
2018-11-14 09:32:42 +00:00
Функционал аналогичен base64Decode, но при невозможности декодирования возвращает пустую строку.
2020-03-19 15:32:53 +00:00
## endsWith(s, suffix) {#endswith}
2019-09-06 09:07:23 +00:00
Возвращает 1, если строка завершается указанным суффиксом, и 0 в противном случае.
2020-03-19 15:32:53 +00:00
## startsWith(str, prefix) {#startswith}
2019-09-06 09:07:23 +00:00
2019-09-26 11:39:06 +00:00
Возвращает 1, если строка начинается указанным префиксом, в противном случае 0.
2020-03-20 18:20:59 +00:00
``` sql
2019-09-30 07:24:02 +00:00
SELECT startsWith('Spider-Man', 'Spi');
2019-09-26 11:39:06 +00:00
```
**Возвращаемые значения**
2020-03-21 04:11:51 +00:00
- 1, если строка начинается указанным префиксом.
- 0, если строка не начинается указанным префиксом.
2019-09-26 11:39:06 +00:00
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-26 11:39:06 +00:00
SELECT startsWith('Hello, world!', 'He');
```
2021-03-13 18:18:45 +00:00
Результат:
2019-09-26 11:39:06 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-09-26 11:39:06 +00:00
┌─startsWith('Hello, world!', 'He')─┐
│ 1 │
└───────────────────────────────────┘
```
2019-09-06 09:07:23 +00:00
2020-01-05 22:50:16 +00:00
## trim {#trim}
Удаляет все указанные символы с начала или окончания строки.
По умолчанию удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с обоих концов строки.
**Синтаксис**
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string)
```
2021-03-13 18:18:45 +00:00
**Аргументы**
2020-01-05 22:50:16 +00:00
2020-04-30 18:19:18 +00:00
- `trim_character` — один или несколько символов, подлежащие удалению. [String ](../../sql-reference/functions/string-functions.md ).
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2020-01-05 22:50:16 +00:00
**Возвращаемое значение**
Исходную строку после обрезки с левого и (или) правого концов строки.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT trim(BOTH ' ()' FROM '( Hello, world! )');
2020-01-05 22:50:16 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2020-01-05 22:50:16 +00:00
2020-03-20 18:20:59 +00:00
``` text
2020-01-05 22:50:16 +00:00
┌─trim(BOTH ' ()' FROM '( Hello, world! )')─┐
│ Hello, world! │
└───────────────────────────────────────────────┘
```
2019-12-05 10:03:35 +00:00
## trimLeft {#trimleft}
Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с левого конца строки. Н е удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trimLeft(input_string)
2019-12-05 10:03:35 +00:00
```
2020-01-05 22:50:16 +00:00
Алиас: `ltrim(input_string)` .
2019-12-05 10:03:35 +00:00
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-12-05 10:03:35 +00:00
2020-04-30 18:19:18 +00:00
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2019-12-05 10:03:35 +00:00
**Возвращаемое значение**
Исходную строку без общих пробельных символов слева.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT trimLeft(' Hello, world! ');
2019-12-05 10:03:35 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-12-05 10:03:35 +00:00
┌─trimLeft(' Hello, world! ')─┐
│ Hello, world! │
└─────────────────────────────────────┘
```
2020-03-20 18:20:59 +00:00
## trimRight {#trimright}
2019-12-05 10:03:35 +00:00
Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с правого конца строки. Н е удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trimRight(input_string)
2019-12-05 10:03:35 +00:00
```
2020-01-05 22:50:16 +00:00
Алиас: `rtrim(input_string)` .
2019-12-05 10:03:35 +00:00
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-12-05 10:03:35 +00:00
2020-04-30 18:19:18 +00:00
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2019-12-05 10:03:35 +00:00
**Возвращаемое значение**
Исходную строку без общих пробельных символов справа.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT trimRight(' Hello, world! ');
2019-12-05 10:03:35 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-12-05 10:03:35 +00:00
┌─trimRight(' Hello, world! ')─┐
│ Hello, world! │
└──────────────────────────────────────┘
```
## trimBoth {#trimboth}
Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с обоих концов строки. Н е удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trimBoth(input_string)
2019-12-05 10:03:35 +00:00
```
2020-01-05 22:50:16 +00:00
Алиас: `trim(input_string)` .
2019-12-05 10:03:35 +00:00
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-12-05 10:03:35 +00:00
2020-04-30 18:19:18 +00:00
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2019-12-05 10:03:35 +00:00
**Возвращаемое значение**
Исходную строку без общих пробельных символов с обоих концов строки.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2021-03-13 18:18:45 +00:00
SELECT trimBoth(' Hello, world! ');
2019-12-05 10:03:35 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-12-05 10:03:35 +00:00
┌─trimBoth(' Hello, world! ')─┐
│ Hello, world! │
└─────────────────────────────────────┘
```
2020-03-19 15:32:53 +00:00
## CRC32(s) {#crc32}
2019-09-26 11:39:06 +00:00
2019-10-20 20:04:52 +00:00
Возвращает чексумму CRC32 данной строки, используется CRC-32-IEEE 802.3 многочлен и начальным значением `0xffffffff` (т.к. используется реализация из zlib).
2020-03-19 15:32:53 +00:00
Тип результата — UInt32.
2019-10-20 20:04:52 +00:00
2020-03-19 15:32:53 +00:00
## CRC32IEEE(s) {#crc32ieee}
2019-10-20 20:04:52 +00:00
Возвращает чексумму CRC32 данной строки, используется CRC-32-IEEE 802.3 многочлен.
2020-03-19 15:32:53 +00:00
Тип результата — UInt32.
2019-06-17 21:49:37 +00:00
2020-03-19 15:32:53 +00:00
## CRC64(s) {#crc64}
2019-10-20 20:04:52 +00:00
Возвращает чексумму CRC64 данной строки, используется CRC-64-ECMA многочлен.
2020-03-19 15:32:53 +00:00
Тип результата — UInt64.
2019-10-20 20:04:52 +00:00
2020-09-28 20:58:08 +00:00
## normalizeQuery {#normalized-query}
Заменяет литералы, последовательности литералов и сложные псевдонимы заполнителями.
2021-03-13 18:18:45 +00:00
**Синтаксис**
2020-09-28 20:58:08 +00:00
``` sql
normalizeQuery(x)
```
2021-07-29 15:20:55 +00:00
**Аргументы**
2020-09-28 20:58:08 +00:00
2021-03-13 18:18:45 +00:00
- `x` — последовательность символов. [String ](../../sql-reference/data-types/string.md ).
2020-09-28 20:58:08 +00:00
**Возвращаемое значение**
- Последовательность символов с заполнителями.
Тип: [String ](../../sql-reference/data-types/string.md ).
**Пример**
Запрос:
``` sql
SELECT normalizeQuery('[1, 2, 3, x]') AS query;
```
Результат:
``` text
┌─query────┐
│ [?.., x] │
└──────────┘
```
## normalizedQueryHash {#normalized-query-hash}
Возвращает идентичные 64-битные хэш - суммы без значений литералов для аналогичных запросов. Это помогает анализировать журнал запросов.
2021-07-29 15:20:55 +00:00
**Синтаксис**
2020-09-28 20:58:08 +00:00
``` sql
normalizedQueryHash(x)
```
2021-07-29 15:20:55 +00:00
**Аргументы**
2020-09-28 20:58:08 +00:00
2021-03-13 18:18:45 +00:00
- `x` — последовательность символов. [String ](../../sql-reference/data-types/string.md ).
2020-09-28 20:58:08 +00:00
**Возвращаемое значение**
- Хэш-сумма.
Тип: [UInt64 ](../../sql-reference/data-types/int-uint.md#uint-ranges ).
**Пример**
Запрос:
``` sql
SELECT normalizedQueryHash('SELECT 1 AS `xyz` ') != normalizedQueryHash('SELECT 1 AS `abc` ') AS res;
```
Результат:
``` text
┌─res─┐
│ 1 │
└─────┘
```
2021-01-18 15:24:17 +00:00
## encodeXMLComponent {#encode-xml-component}
2021-01-19 15:24:37 +00:00
Экранирует символы для размещения строки в текстовом узле или атрибуте XML.
2021-01-18 15:24:17 +00:00
2021-01-19 15:24:37 +00:00
Экранируются символы, которые в формате XML являются зарезервированными (служебными): `<` , `&` , `>` , `"` , `'` .
2021-01-18 15:24:17 +00:00
2021-07-29 15:20:55 +00:00
**Синтаксис**
2021-01-18 15:24:17 +00:00
``` sql
encodeXMLComponent(x)
```
2021-07-29 15:20:55 +00:00
**Аргументы**
2021-01-18 15:24:17 +00:00
- `x` — последовательность символов. [String ](../../sql-reference/data-types/string.md ).
**Возвращаемое значение**
2021-01-19 15:24:37 +00:00
- Строка, в которой зарезервированные символы экранированы.
2021-01-18 15:24:17 +00:00
Тип: [String ](../../sql-reference/data-types/string.md ).
**Пример**
Запрос:
``` sql
SELECT encodeXMLComponent('Hello, "world"!');
SELECT encodeXMLComponent('< 123 > ');
SELECT encodeXMLComponent('&clickhouse');
SELECT encodeXMLComponent('\'foo\'');
```
Результат:
``` text
Hello, " world" !
< 123>
& clickhouse
' foo'
```
2021-02-15 15:58:46 +00:00
## decodeXMLComponent {#decode-xml-component}
Заменяет символами предопределенные мнемоники XML: `"` `&` `'` `>` `<`
2021-02-15 18:25:32 +00:00
Также эта функция заменяет числовые ссылки соответствующими символами юникод. Поддерживаются десятичная (например, `✓` ) и шестнадцатеричная (`✓ `) формы.
2021-02-15 15:58:46 +00:00
**Синтаксис**
``` sql
decodeXMLComponent(x)
```
2021-03-13 18:18:45 +00:00
**Аргументы**
2021-02-15 15:58:46 +00:00
- `x` — последовательность символов. [String ](../../sql-reference/data-types/string.md ).
**Возвращаемое значение**
- Строка с произведенными заменами.
Тип: [String ](../../sql-reference/data-types/string.md ).
**Пример**
Запрос:
``` sql
SELECT decodeXMLComponent('' foo' ');
SELECT decodeXMLComponent('< Σ > ');
```
Результат:
``` text
2021-07-29 15:20:55 +00:00
'foo'
2021-02-15 15:58:46 +00:00
< Σ >
```
**Смотрите также**
- [Мнемоники в HTML ](https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML )
2021-04-05 20:19:18 +00:00
## extractTextFromHTML {#extracttextfromhtml}
2021-04-07 19:23:53 +00:00
Функция для извлечения текста из HTML или XHTML.
2021-04-08 20:01:19 +00:00
Она не соответствует всем HTML, XML или XHTML стандартам на 100%, но е е реализация достаточно точная и быстрая. Правила обработки следующие:
2021-04-07 19:23:53 +00:00
2021-04-08 20:01:19 +00:00
1. Комментарии удаляются. Пример: `<!-- test -->` . Комментарий должен оканчиваться символами `-->` . Вложенные комментарии недопустимы.
2021-04-07 19:23:53 +00:00
Примечание: конструкции наподобие `<!-->` и `<!--->` не являются допустимыми комментариями в HTML, но они будут удалены согласно другим правилам.
2021-04-08 20:01:19 +00:00
2. Содержимое CDATA вставляется дословно. Примечание: формат CDATA специфичен для XML/XHTML. Н о он обрабатывается всегда по принципу "наилучшего возможного результата".
2021-04-07 19:23:53 +00:00
3. Элементы `script` и `style` удаляются вместе с о всем содержимым. Примечание: предполагается, что закрывающий тег не может появиться внутри содержимого. Например, в JS строковый литерал должен быть экранирован как `"<\/script>"` .
Примечание: комментарии и CDATA возможны внутри `script` или `style` - тогда закрывающие теги не ищутся внутри CDATA. Пример: `<script><![CDATA[</script>]]></script>` . Н о они ищутся внутри комментариев. Иногда возникают сложные случаи: `<script>var x = "<!--"; </script> var y = "-->"; alert(x + y);</script>`
2021-04-08 20:01:19 +00:00
Примечание: `script` и `style` могут быть названиями пространств имен XML - тогда они не обрабатываются как обычные элементы `script` или `style` . Пример: `<script:a>Hello</script:a>` .
2021-04-07 19:23:53 +00:00
Примечание: пробелы возможны после имени закрывающего тега: `</script >` , но не перед ним: `< / script>` .
4. Другие теги или элементы, подобные тегам, удаляются, а их внутреннее содержимое остается. Пример: `<a>.</a>`
Примечание: ожидается, что такой HTML является недопустимым: `<a test=">"></a>`
Примечание: функция также удаляет подобные тегам элементы: `<>` , `<!>` , и т. д.
2021-04-08 20:01:19 +00:00
Примечание: если встречается тег без завершающего символа `>` , то удаляется этот тег и весь следующий за ним текст: `<hello `
2021-04-07 19:23:53 +00:00
5. Мнемоники HTML и XML не декодируются. Они должны быть обработаны отдельной функцией.
2021-04-08 20:01:19 +00:00
6. Пробелы в тексте удаляются и добавляются по следующим правилам:
2021-04-07 19:23:53 +00:00
- Пробелы в начале и в конце извлеченного текста удаляются.
2021-04-08 20:01:19 +00:00
- Несколько пробелов подряд заменяются одним пробелом.
- Если текст разделен другими удаляемыми элементами и в этом месте нет пробела, он добавляется.
- Это может привести к появлению неестественного написания, например: `Hello<b>world</b>` , `Hello<!-- -->world` — в HTML нет пробелов, но функция вставляет их. Также следует учитывать такие варианты написания: `Hello<p>world</p>` , `Hello<br>world` . Подобные результаты выполнения функции могут использоваться для анализа данных, например, для преобразования HTML-текста в набор используемых слов.
2021-04-07 19:23:53 +00:00
7. Также обратите внимание, что правильная обработка пробелов требует поддержки `<pre></pre>` и свойств CSS `display` и `white-space` .
2021-04-05 20:19:18 +00:00
**Синтаксис**
``` sql
extractTextFromHTML(x)
```
**Аргументы**
2021-07-29 15:20:55 +00:00
- `x` — текст для обработки. [String ](../../sql-reference/data-types/string.md ).
2021-04-05 20:19:18 +00:00
**Возвращаемое значение**
2021-04-05 20:34:10 +00:00
- Извлеченный текст.
2021-04-05 20:19:18 +00:00
Тип: [String ](../../sql-reference/data-types/string.md ).
**Пример**
2021-04-05 20:34:10 +00:00
Первый пример содержит несколько тегов и комментарий. Н а этом примере также видно, как обрабатываются пробелы.
2021-04-05 20:19:18 +00:00
Второй пример показывает обработку `CDATA` и тега `script` .
2021-04-08 20:01:19 +00:00
В третьем примере текст выделяется из полного HTML ответа, полученного с помощью функции [url ](../../sql-reference/table-functions/url.md ).
2021-04-05 20:19:18 +00:00
Запрос:
``` sql
2021-04-05 20:58:07 +00:00
SELECT extractTextFromHTML(' < p > A text < i > with< / i > < b > tags< / b > . <!-- comments --> < / p > ');
2021-04-05 20:19:18 +00:00
SELECT extractTextFromHTML('<![CDATA[The content within <b>CDATA</b>]]> < script > alert ( "Script" ) ; < / script > ');
SELECT extractTextFromHTML(html) FROM url('http://www.donothingfor2minutes.com/', RawBLOB, 'html String');
```
Результат:
``` text
2021-04-05 20:58:07 +00:00
A text with tags .
2021-04-05 20:19:18 +00:00
The content within < b > CDATA< / b >
Do Nothing for 2 Minutes 2:00
```