web-dev-qa-db-fra.com

MySQL enum vs. set

Pour MySQL Data, type "enum" et "set", quels sont les différences, avantages et inconvénients d'utiliser l'une par rapport à l'autre?

Exemple de type de données:

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

La seule différence que je connaisse est qu'ENUM ne permet de sélectionner qu'une valeur par rapport à SET, ce qui permet de sélectionner plusieurs valeurs.

63
tfont

Comme indiqué dans la documentation MySQL

La définition d'une colonne ENUM ou SET agit comme une contrainte sur les valeurs entré dans la colonne. Une erreur se produit pour les valeurs qui ne le font pas satisfaire 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 l'erreur valeur (c'est-à-dire 0 ou la chaîne vide). Pour une colonne définie par ENUM ('a', 'b', 'c'), des valeurs telles que '', 'd' ou 'ax' sont illégales et sont rejeté.

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

57
user2001117

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

111
Brad Kent

Enum et Set dépendent totalement des exigences. Par exemple, si vous avez une liste de boutons radio dans laquelle vous ne pouvez en choisir qu’un à la fois, utilisez Enum. Et si vous avez une liste de cases à cocher où plus d'un élément peut être choisi à la fois, utilisez set.

38
Abhishek Singh
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 réalité 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 en réalité être stocké qu'une fois à la fois. Et vous constaterez que les résultats des 2 dernières lignes seront vides. 

19
Winbobob

En fait c'est assez simple:

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

Lorsque vous définissez un SET ('R', 'W', 'X') alors vous pouvez INSERT une chaîne vide, ou une ou plusieurs de ces valeurs. Si vous insérez quelque chose qui ne fait pas partie de 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 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 erronés, car lors de l'insertion de plusieurs valeurs, les valeurs doivent être des chaînes, séparées par des virgules. Toutes ses insertions n’insèrent qu’une seule valeur (et les deux dernières ne font pas partie de l’ensemble défini) 

0
Harly H.