Строка фиксированной длины размером N байт (не символов и не кодовых точек).
Чтобы объявить столбец типа FixedString, используйте следующий синтаксис:
<column_name> FixedString(N)Где N — натуральное число.
Тип FixedString эффективен, когда длина данных составляет ровно N байт. Во всех остальных случаях он, скорее всего, снижает производительность.
Примеры значений, которые можно эффективно хранить в столбцах типа FixedString:
- Двоичное представление IP-адресов (
FixedString(16)для IPv6). - Коды языков (ru_RU, en_US, …).
- Коды валют (USD, RUB, …).
- Двоичное представление хешей (
FixedString(16)для MD5,FixedString(32)для SHA256).
Для хранения значений UUID используйте тип данных UUID.
При вставке данных ClickHouse:
- Дополняет строку null-байтами, если строка содержит меньше
Nбайт. - Генерирует исключение
Too large value for FixedString(N), если строка содержит большеNбайт.
Рассмотрим следующую таблицу с единственным столбцом FixedString(2):
INSERT INTO FixedStringTable VALUES ('a'), ('ab'), ('');SELECT
name,
toTypeName(name),
length(name),
empty(name)
FROM FixedStringTable;┌─name─┬─toTypeName(name)─┬─length(name)─┬─empty(name)─┐
│ a │ FixedString(2) │ 2 │ 0 │
│ ab │ FixedString(2) │ 2 │ 0 │
│ │ FixedString(2) │ 2 │ 1 │
└──────┴──────────────────┴──────────────┴─────────────┘Обратите внимание, что длина значения FixedString(N) постоянна. Функция length возвращает N, даже если значение FixedString(N) заполнено только null-байтами, однако функция empty в этом случае возвращает 1.
При выборке данных с помощью предложения WHERE результаты могут различаться в зависимости от того, как задано условие:
- Если используется оператор равенства
=или==либо функцияequals, ClickHouse не учитывает символ\0, то есть запросыSELECT * FROM FixedStringTable WHERE name = 'a';иSELECT * FROM FixedStringTable WHERE name = 'a\0';возвращают одинаковый результат. - Если используется предложение
LIKE, ClickHouse учитывает символ\0, поэтому в условии фильтрации может потребоваться явно указать символ\0.
SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow
{"name":"a\u0000"}
SELECT name
FROM FixedStringTable
WHERE name = 'a\0'
FORMAT JSONStringsEachRow
{"name":"a\u0000"}
SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow
Query id: c32cec28-bb9e-4650-86ce-d74a1694d79e
{"name":"a\u0000"}
SELECT name
FROM FixedStringTable
WHERE name LIKE 'a'
FORMAT JSONStringsEachRow
0 rows in set.
SELECT name
FROM FixedStringTable
WHERE name LIKE 'a\0'
FORMAT JSONStringsEachRow
{"name":"a\u0000"}