Wyliczenie MySQL a zestaw

89

Dla typu danych MySQL „wyliczenie” i „zestaw”, jakie są różnice, zalety i wady korzystania z jednego w porównaniu z drugim?

Przykładowy typ danych:

  • wyliczenie („A”, „B”, „C”)
  • zestaw („A”, „B”, „C”)

Jedyną różnicą, o której wiem, jest to, że ENUM umożliwia wybranie tylko jednej wartości, a SET pozwala wybrać wiele wartości.

tfont
źródło
5
No adv / disadv. Powinieneś wybrać jeden z nich w zależności od swoich wymagań.
ravnur
1
Te dwa typy nie są ze sobą powiązane. Równie dobrze możesz zapytać, co jest lepsze - int czy tekst?
Bohemian

Odpowiedzi:

66

Jak stwierdza dokumentacja MySQL :

Definicja kolumny ENUM lub SET działa jako ograniczenie wartości wprowadzonych do kolumny. W przypadku wartości, które nie spełniają tych warunków, występuje błąd:

Wartość ENUM musi być jedną z wymienionych w definicji kolumny lub jej wewnętrznym odpowiednikiem liczbowym. Wartość nie może być wartością błędu (czyli 0 lub pustym ciągiem). W przypadku kolumny zdefiniowanej jako ENUM („a”, „b”, „c”) wartości takie jak „”, „d” lub „ax” są niedozwolone i są odrzucane.

Wartość SET musi być pustym ciągiem lub wartością składającą się tylko z wartości wymienionych w definicji kolumny, oddzielonych przecinkami. W przypadku kolumny zdefiniowanej jako SET („a”, „b”, „c”) wartości takie jak „d” lub „a, b, c, d” są niedozwolone i są odrzucane.

user2001117
źródło
22
UWAGA! Wartość (a, b, c, d)nie zostanie odrzucona. Tylko dwola zostanie odrzucona, co daje wartość (a, b, c).
Itay Grudev
3
Może to być oficjalna dokumentacja, ale nadal jest to bardzo mylący sposób ich opisu. Na podstawie innych odpowiedzi różnica staje się oczywista. SET to tablica ENUM, gdzie każda wartość składa się z 0 lub więcej wartości stylu wyliczenia.
Jonathon
9
To nie jest dobra odpowiedź. Poproszono o jasne wyjaśnienie różnic i wad / zalet; oficjalna dokumentacja, której ta odpowiedź jest zwykłą kopią, zawodzi.
Smuuf
(a, b, c, d) zostaną odrzucone, jeśli włączony jest tryb
ścisły
2
To nie jest odpowiedź.
Amit Shah,
198

analogia:
ENUM = pola radiowe (wymienione są tylko akceptowane wartości, można wybrać tylko jedną)
SET = pola wyboru (wymienione są tylko akceptowane wartości, można wybrać wiele)

Brad Kent
źródło
5
Czyste i łatwe do zrozumienia!
Abu Shoeb,
To jest właściwa różnica, która została jasno opisana. Dziękuję @Brad Kent
Ravi Teja
44

Enum i Set całkowicie zależą od wymagań, na przykład jeśli masz listę przycisków opcji, z których można wybrać tylko jeden naraz, użyj Enum. A jeśli masz listę pól wyboru, w których można wybrać więcej niż jedną pozycję, użyj set.

Abhishek Singh
źródło
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');

Możesz skopiować powyższy kod i wkleić go do mysql, a przekonasz się, że SET faktycznie jest kolekcją. Możesz przechowywać każdy zestaw atrybutów, które deklarujesz.

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

Możesz również skopiować powyższy kod. Przekonasz się, że każdy ENUM może być przechowywany tylko raz za każdym razem. Przekonasz się, że wyniki z ostatnich 2 wierszy będą puste.

Winbobob
źródło
9

Właściwie to całkiem proste:

Podczas definiowania ENUM ( „Tak”, „Nie”, „Być może”), wtedy należy włożyć tylko jedną z tych wartości (lub ich pozycyjną numer indeksu)

Po zdefiniowaniu zestawie ( „R”, „W”, „X”), wtedy można wstawić pusty fragment, lub jeden lub więcej z tych wartości. Jeśli wstawisz coś, czego nie ma we wstępnie zdefiniowanym zestawie, zamiast tego zostanie wstawiony pusty ciąg. Zauważ, że przed wstawieniem wszystkie zduplikowane wartości są odrzucane, więc wstawiane jest tylko jedno wystąpienie każdej dozwolonej wartości.

Mam nadzieję, że to wyjaśnia sprawę.

Zwróć uwagę, że odpowiedź Winbobob jest niepoprawna i zawiera błędne przykłady, ponieważ podczas wstawiania wielu wartości wartości muszą być ciągami znaków oddzielonymi przecinkami. Wszystkie jego wstawki faktycznie wstawiają tylko jedną wartość (a ostatnie dwie nie znajdują się w zdefiniowanym zestawie)

Harly H.
źródło