Chaîne de longueur fixe de N octets (ni caractères ni points de code).
Pour déclarer une colonne de type FixedString, utilisez la syntaxe suivante :
<column_name> FixedString(N)où N représente un nombre naturel.
Le type FixedString est efficace lorsque les données ont une longueur exactement égale à N octets. Dans tous les autres cas, il risque de réduire l'efficacité.
Exemples de valeurs pouvant être stockées efficacement dans des colonnes de type FixedString :
- La représentation binaire des adresses IP (
FixedString(16)pour IPv6). - Les codes de langue (ru_RU, en_US, …).
- Les codes de devise (USD, RUB, …).
- La représentation binaire des hachages (
FixedString(16)pour MD5,FixedString(32)pour SHA256).
Pour stocker des valeurs UUID, utilisez le type de données UUID.
Lors de l'insertion de données, ClickHouse :
- Complète la chaîne avec des octets nuls si elle contient moins de
Noctets. - Lève l'exception
Too large value for FixedString(N)si la chaîne contient plus deNoctets.
Considérons la table suivante avec une seule colonne 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 │
└──────┴──────────────────┴──────────────┴─────────────┘Notez que la longueur de la valeur FixedString(N) est constante. La fonction length renvoie N même si la valeur FixedString(N) n’est remplie que d’octets nuls, mais la fonction empty renvoie 1 dans ce cas.
La sélection de données avec la clause WHERE renvoie des résultats différents selon la manière dont la condition est spécifiée :
- Si l’opérateur d’égalité
=ou==, ou la fonctionequals, est utilisé, ClickHouse ne tient pas compte du caractère\0, c.-à-d. que les requêtesSELECT * FROM FixedStringTable WHERE name = 'a';etSELECT * FROM FixedStringTable WHERE name = 'a\0';renvoient le même résultat. - Si la clause
LIKEest utilisée, ClickHouse tient bien compte du caractère\0, il peut donc être nécessaire de spécifier explicitement le caractère\0dans la condition de filtre.
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"}