MySQL-Aufzählung vs.

88

Was sind für MySQL Datentyp "enum" und "set" die Unterschiede sowie Vor- und Nachteile der Verwendung eines gegenüber dem anderen?

Beispieldatentyp:

  • Aufzählung ('A', 'B', 'C')
  • set ('A', 'B', 'C')

Der einzige mir bekannte Unterschied besteht darin, dass mit ENUM nur ein Wert ausgewählt werden kann und mit SET mehrere Werte ausgewählt werden können.

tfont
quelle
5
Kein adv / disadv. Sie sollten je nach Ihren Anforderungen eine davon auswählen.
Ravnur
1
Die beiden Typen haben nichts miteinander zu tun. Sie könnten genauso gut fragen, was besser ist - int oder Text?
Böhmisch

Antworten:

67

In der MySQL-Dokumentation heißt es:

Die Definition einer ENUM- oder SET-Spalte wirkt sich als Einschränkung für die in die Spalte eingegebenen Werte aus. Bei Werten, die diese Bedingungen nicht erfüllen, tritt ein Fehler auf:

Ein ENUM-Wert muss einer der in der Spaltendefinition aufgeführten Werte oder das interne numerische Äquivalent davon sein. Der Wert kann nicht der Fehlerwert sein (dh 0 oder die leere Zeichenfolge). Für eine als ENUM definierte Spalte ('a', 'b', 'c') sind Werte wie '', 'd' oder 'ax' unzulässig und werden abgelehnt.

Ein SET-Wert muss die leere Zeichenfolge oder ein Wert sein, der nur aus den in der durch Kommas getrennten Spaltendefinition aufgeführten Werten besteht. Für eine als SET definierte Spalte ('a', 'b', 'c') sind Werte wie 'd' oder 'a, b, c, d' unzulässig und werden abgelehnt.

user2001117
quelle
22
HINWEIS! Ein Wert von (a, b, c, d)wird nicht abgelehnt. Nur das dwird abgelehnt, was zum Wert führt (a, b, c).
Itay Grudev
3
Dies mag die offizielle Dokumentation sein, aber es ist immer noch eine sehr verwirrende Art, sie zu beschreiben. Anhand anderer Antworten wird der Unterschied deutlich. SET ist ein Array von ENUM, wobei jeder Wert aus 0 oder mehr Enum-Stilwerten besteht.
Jonathon
9
Dies ist keine gute Antwort. Es wurde um eine klare Erklärung der Unterschiede und Nachteile gebeten. Die offizielle Dokumentation, von der diese Antwort nur eine Kopie ist, schlägt fehl.
Smuuf
(a, b, c, d) wird abgelehnt, wenn der Strict-Modus
aktiviert
2
Dies ist nicht die Antwort.
Amit Shah
190

Analogie:
ENUM = Radiofelder (nur akzeptierte Werte sind die aufgelisteten, darf nur eines auswählen)
SET = Kontrollkästchenfelder (nur akzeptierte Werte sind die aufgelisteten, können mehrere auswählen)

Brad Kent
quelle
4
Sauber und leicht zu verstehen!
Abu Shoeb
44

Enum und Set hängen vollständig von den Anforderungen ab. Wenn Sie beispielsweise eine Liste mit Optionsfeldern haben, in denen jeweils nur eines ausgewählt werden kann, verwenden Sie Enum. Wenn Sie eine Liste mit Kontrollkästchen haben, in der jeweils mehr als ein Element ausgewählt werden kann, verwenden Sie set.

Abhishek Singh
quelle
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');

Sie können den obigen Code kopieren und in MySQL einfügen, und Sie werden feststellen, dass SET tatsächlich eine Sammlung ist. Sie können jede von Ihnen deklarierte Kombination von Attributen speichern.

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');

Sie können den obigen Code auch kopieren. Und Sie werden feststellen, dass jede ENUM tatsächlich nur einmal gespeichert werden kann. Und Sie werden feststellen, dass die Ergebnisse der letzten beiden Zeilen beide leer sind.

Winbobob
quelle
9

Eigentlich ist es ziemlich einfach:

Wenn Sie eine ENUM definieren ('Ja', 'Nein', 'Vielleicht') , müssen Sie nur einen dieser Werte (oder deren Positionsindexnummer) EINFÜGEN.

Wenn Sie ein SET ('R', 'W', 'X') definieren , können Sie eine leere Zeichenfolge oder einen oder mehrere dieser Werte einfügen. Wenn Sie etwas einfügen, das nicht in der vordefinierten Menge enthalten ist, wird stattdessen eine leere Zeichenfolge eingefügt. Beachten Sie, dass vor dem Einfügen alle doppelten Werte verworfen werden, sodass nur eine Instanz jedes zulässigen Werts eingefügt wird.

Hoffe das klärt es auf.

Bitte beachten Sie, dass die Antwort von Winbobob falsch ist und fehlerhafte Beispiele enthält. Beim Einfügen mehrerer Werte müssen die Werte Zeichenfolgen sein, die durch Kommas getrennt sind. Alle seine Einfügungen fügen tatsächlich nur einen einzigen Wert ein (und die letzten beiden sind nicht in der definierten Menge enthalten).

Harly H.
quelle