* Replace underscores with hyphens * remove temporary code * fix style check * fix collapse
6.3 KiB
machine_translated | machine_translated_rev | toc_priority | toc_title |
---|---|---|---|
true | f865c9653f |
50 | Enum |
Enum
Type énuméré composé de valeurs nommées.
Les valeurs nommées doivent être déclarées comme 'string' = integer
pair. ClickHouse ne stocke que des nombres, mais prend en charge les opérations avec les valeurs à travers leurs noms.
Supports ClickHouse:
- 8-bit
Enum
. Il peut contenir jusqu’à 256 valeurs énumérées dans le[-128, 127]
gamme. - 16 bits
Enum
. Il peut contenir jusqu’à 65 536 valeurs énumérées dans le[-32768, 32767]
gamme.
Clickhouse choisit automatiquement le type de Enum
lorsque les données sont insérées. Vous pouvez également utiliser Enum8
ou Enum16
types pour être sûr de la taille de stockage.
Exemples D’Utilisation
Ici, nous créons une table avec une Enum8('hello' = 1, 'world' = 2)
type de colonne:
CREATE TABLE t_enum
(
x Enum('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog
Colonne x
ne peut stocker que les valeurs répertoriées dans la définition de type: 'hello'
ou 'world'
. Si vous essayez d’enregistrer une autre valeur, ClickHouse déclenchera une exception. Taille 8 bits pour cela Enum
est choisi automatiquement.
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
Ok.
INSERT INTO t_enum values('a')
Exception on client:
Code: 49. DB::Exception: Unknown element 'a' for type Enum('hello' = 1, 'world' = 2)
Lorsque vous interrogez des données de la table, ClickHouse affiche les valeurs de chaîne de Enum
.
SELECT * FROM t_enum
┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘
Si vous avez besoin de voir les équivalents numériques des lignes, vous devez Enum
valeur en type entier.
SELECT CAST(x, 'Int8') FROM t_enum
┌─CAST(x, 'Int8')─┐
│ 1 │
│ 2 │
│ 1 │
└─────────────────┘
Pour créer une valeur d’Enum dans une requête, vous devez également utiliser CAST
.
SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))
┌─toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))─┐
│ Enum8('a' = 1, 'b' = 2) │
└─────────────────────────────────────────────────────┘
Règles générales Et Utilisation
Chacune des valeurs se voit attribuer un nombre dans la plage -128 ... 127
pour Enum8
ou dans la gamme -32768 ... 32767
pour Enum16
. Toutes les chaînes et les nombres doivent être différents. Une chaîne vide est autorisé. Si ce type est spécifié (dans une définition de table), les nombres peuvent être dans un ordre arbitraire. Toutefois, l’ordre n’a pas d’importance.
Ni la chaîne ni la valeur numérique dans un Enum
peut être NULL.
Un Enum
peut être contenue dans Nullable type. Donc, si vous créez une table en utilisant la requête
CREATE TABLE t_enum_nullable
(
x Nullable( Enum8('hello' = 1, 'world' = 2) )
)
ENGINE = TinyLog
il peut stocker non seulement des 'hello'
et 'world'
, mais NULL
, ainsi.
INSERT INTO t_enum_nullable Values('hello'),('world'),(NULL)
Dans la mémoire RAM, un Enum
la colonne est stockée dans la même manière que Int8
ou Int16
des valeurs numériques correspondantes.
Lors de la lecture sous forme de texte, ClickHouse analyse la valeur sous forme de chaîne et recherche la chaîne correspondante à partir de l’ensemble des valeurs Enum. Si elle n’est pas trouvée, une exception est levée. Lors de la lecture au format texte, la chaîne est lue et la valeur numérique correspondante est recherchée. Une exception sera levée si il n’est pas trouvé. Lors de l’écriture sous forme de texte, il écrit la valeur correspondante de la chaîne. Si les données de colonne contiennent des déchets (nombres qui ne proviennent pas de l’ensemble valide), une exception est levée. Lors de la lecture et de l’écriture sous forme binaire, cela fonctionne de la même manière que pour les types de données Int8 et Int16. La valeur implicite par défaut est la valeur avec le numéro le plus bas.
Lors ORDER BY
, GROUP BY
, IN
, DISTINCT
et ainsi de suite, les Énumérations se comportent de la même façon que les nombres correspondants. Par exemple, ORDER BY les trie numériquement. Les opérateurs d’égalité et de comparaison fonctionnent de la même manière sur les énumérations que sur les valeurs numériques sous-jacentes.
Les valeurs Enum ne peuvent pas être comparées aux nombres. Les Enums peuvent être comparés à une chaîne constante. Si la chaîne comparée à n’est pas une valeur valide pour L’énumération, une exception sera levée. L’opérateur est pris en charge avec l’Enum sur le côté gauche, et un ensemble de chaînes sur le côté droit. Les chaînes sont les valeurs de L’énumération correspondante.
Most numeric and string operations are not defined for Enum values, e.g. adding a number to an Enum or concatenating a string to an Enum.
Cependant, L’énumération a un naturel toString
fonction qui renvoie sa valeur de chaîne.
Les valeurs Enum sont également convertibles en types numériques en utilisant toT
fonction, où T est un type numérique. Lorsque T correspond au type numérique sous-jacent de l’énumération, cette conversion est à coût nul.
Le type Enum peut être modifié sans coût en utilisant ALTER, si seulement l’ensemble des valeurs est modifié. Il est possible d’ajouter et de supprimer des membres de L’énumération en utilisant ALTER (la suppression n’est sûre que si la valeur supprimée n’a jamais été utilisée dans la table). À titre de sauvegarde, la modification de la valeur numérique d’un membre Enum précédemment défini lancera une exception.
En utilisant ALTER, il est possible de changer un Enum8 en Enum16 ou vice versa, tout comme changer un Int8 en Int16.