web-dev-qa-db-de.com

MySQL-Aufzählung vs. Satz

Für MySQL Datentyp "enum" und "set" - was sind die Unterschiede und Vor- und Nachteile der Verwendung eines Konkurrenten?

Beispieldatentyp:

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

Der einzige Unterschied, den ich kenne, ist, dass mit ENUM nur ein Wert ausgewählt werden kann. Mit SET können mehrere Werte ausgewählt werden.

63
tfont

In der MySQL-Dokumentation heißt es:

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

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

Ein SET-Wert muss der leere String oder ein Wert sein, der nur aus der .__ besteht. Werte, die in der Spaltendefinition aufgeführt sind, werden durch Kommas getrennt. Für ein Spalte definiert als SET ('a', 'b', 'c'), Werte wie 'd' oder 'a, b, c, d' sind illegal und werden abgelehnt.

57
user2001117

analogie:
ENUM = Radiofelder (nur akzeptierte Werte sind die aufgeführten, können nur einen auswählen)
SET = Kontrollkästchenfelder (nur akzeptierte Werte sind die aufgelisteten, können mehrere auswählen)

111
Brad Kent

Enum und Set hängen vollständig von den Anforderungen ab. Wenn Sie beispielsweise eine Liste mit Optionsfeldern haben, für die jeweils nur eines ausgewählt werden kann, verwenden Sie Enum. Wenn Sie eine Liste mit Kontrollkästchen haben, in der zu einem Zeitpunkt mehr als ein Element ausgewählt werden kann, verwenden Sie 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');

Sie können den obigen Code kopieren und in mysql einfügen. Sie werden feststellen, dassSETtatsächlich eine Sammlung ist. Sie können jede Kombination von Attributen speichern, die Sie deklarieren.

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 jedesENUMtatsächlich nur einmal gespeichert werden kann. Sie werden feststellen, dass die Ergebnisse der letzten 2 Zeilen beide leer sind. 

19
Winbobob

Eigentlich ist es ziemlich einfach:

Wenn Sie ein ENUM definieren ('Ja', 'Nein', 'Vielleicht'), müssen Sie müssen nur einen dieser Werte (oder deren Positionsindexnummer) einfügen.

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

Hoffe das klärt es.

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 zwei sind nicht in der definierten Menge) 

0
Harly H.