Énumération MySQL vs ensemble

88

Pour les types de données MySQL «enum» et «set», quelles sont les différences, les avantages et les inconvénients de l'utilisation de l'un par rapport à l'autre?

Exemple de type de données:

  • enum ('A', 'B', 'C')
  • set ('A', 'B', 'C')

La seule différence dont je suis conscient est que ENUM ne permet qu'une seule valeur à être sélectionnée par rapport à SET permet de sélectionner plusieurs valeurs.

tfont
la source
5
Aucun avantage / désavantage. Vous devez en choisir un en fonction de vos besoins.
ravnur
1
Les deux types ne sont pas liés. Vous pourriez aussi bien demander quel est le meilleur - int ou texte?
Bohème

Réponses:

66

Comme l'indique la documentation MySQL :

La définition d'une colonne ENUM ou SET agit comme une contrainte sur les valeurs entrées dans la colonne. Une erreur se produit pour les valeurs qui ne satisfont pas à ces conditions:

Une valeur ENUM doit être l'une de celles répertoriées dans la définition de colonne, ou son équivalent numérique interne. La valeur ne peut pas être la valeur d'erreur (c'est-à-dire 0 ou la chaîne vide). Pour une colonne définie comme ENUM («a», «b», «c»), les valeurs telles que «», «d» ou «ax» sont illégales et sont rejetées.

Une valeur SET doit être la chaîne vide ou une valeur constituée uniquement des valeurs répertoriées dans la définition de colonne séparées par des virgules. Pour une colonne définie comme SET («a», «b», «c»), les valeurs telles que «d» ou «a, b, c, d» sont illégales et sont rejetées.

user2001117
la source
22
REMARQUE! Une valeur de (a, b, c, d)ne sera pas rejetée. Seule la dvolonté sera rejetée, entraînant ainsi la valeur (a, b, c).
Itay Grudev
3
C'est peut-être la documentation officielle, mais c'est toujours une façon très déroutante de les décrire. Sur la base d'autres réponses, la différence devient claire. SET est un tableau d'ENUM, où chaque valeur se compose de 0 ou plus de valeurs de style enum.
Jonathon
9
Ce n'est pas une bonne réponse. Une explication claire des différences et des inconvénients a été demandée; la documentation officielle, dont cette réponse n'est qu'une copie, échoue à le faire.
Smuuf
(a, b, c, d) sera rejeté si le mode Strict est activé
Chinmay
2
Ce n'est pas la réponse.
Amit Shah
197

analogie:
ENUM = champs radio (seules les valeurs acceptées sont celles listées, ne peut en choisir qu'une)
SET = cases à cocher (seules les valeurs acceptées sont celles listées, peuvent en choisir plusieurs)

Brad Kent
la source
5
Propre et facile à comprendre!
Abu Shoeb
C'est la différence correcte qui est clairement décrite. Merci @Brad Kent
Ravi Teja
44

Enum et Set dépendent totalement des exigences, comme si vous avez une liste de boutons radio dont un seul peut être choisi à la fois, utilisez Enum. Et si vous avez une liste de cases à cocher où à la fois plusieurs éléments peuvent être choisis, utilisez set.

Abhishek Singh
la source
22
CREATE TABLE setTest(
  attrib SET('bold','italic','underline')
);

INSERT INTO setTest (attrib) VALUES ('bold');
INSERT INTO setTest (attrib) VALUES ('bold,italic');
INSERT INTO setTest (attrib) VALUES ('bold,italic,underline');

Vous pouvez copier le code ci-dessus et le coller dans mysql, et vous constaterez que SET est en fait une collection. Vous pouvez stocker chaque combinaison d'attributs que vous déclarez.

CREATE TABLE enumTest(
 color ENUM('red','green','blue')
);

INSERT INTO enumTest (color) VALUES ('red');
INSERT INTO enumTest (color) VALUES ('gray');
INSERT INTO enumTest (color) VALUES ('red,green');

Vous pouvez également copier le code ci-dessus. Et vous constaterez que chaque ENUM ne peut être stocké qu'une seule fois à chaque fois. Et vous constaterez que les résultats des 2 dernières lignes seront tous les deux vides.

Winbobob
la source
9

En fait, c'est assez simple:

Lorsque vous définissez un ENUM ('Oui', 'Non', 'Peut-être'), vous devez INSÉRER une seule de ces valeurs (ou leur numéro d'index de position)

Lorsque vous définissez un SET ('R', 'W', 'X'), vous pouvez INSÉRER une chaîne vide, ou une ou plusieurs de ces valeurs. Si vous insérez quelque chose qui ne figure pas dans l'ensemble prédéfini, une chaîne vide est insérée à la place. Notez qu'avant d'insérer toutes les valeurs en double sont ignorées, une seule instance de chaque valeur autorisée est donc insérée.

J'espère que cela clarifie les choses.

Veuillez noter que la réponse de Winbobob est incorrecte et contient des exemples défectueux, car lors de l'insertion de plusieurs valeurs, les valeurs doivent être des chaînes, séparées par des virgules. Tous ses inserts n'insèrent en fait qu'une seule valeur (et les deux derniers ne font pas partie de l'ensemble défini)

Harly H.
la source