2013-02-10 14 views
50

Dla typu danych "wyliczenie" i "zestaw" danych MySQL, jakie są różnice i zalety i wady korzystania z jednego kontra drugiego?Wyliczanie MySQL kontra zestaw

Przykład Typ danych:

  • wyliczenia ('A', 'B', 'C')
  • zestaw ('A', 'B', 'C')

Jedyną różnicą, o której mi wiadomo jest to, że ENUM pozwala tylko na wybór jednej wartości, a SET pozwala wybrać wiele wartości.

+3

Nie adv/disadv . Powinieneś wybrać jedną z nich w zależności od wymagań. – ravnur

+1

Te dwa typy nie są powiązane. Równie dobrze możesz zapytać, co jest lepsze - int lub tekst? – Bohemian

Odpowiedz

54

Jak MySQL documentation stanów:

Definicja ENUM lub SET kolumna działa jako czynnik ograniczający wartości wprowadzonej do kolumny. Wystąpił błąd w przypadku wartości, które nie spełniają tych warunków:

Wartość ENUM musi być jedną z wartości wymienionych w definicji kolumny, lub ich wewnętrznych odpowiedników numerycznych. Wartość nie może być wartością błędu (czyli 0 lub pustym łańcuchem). W przypadku kolumny zdefiniowanej jako ENUM ("a", "b", "c") wartości takie jak "," d "lub" siekierka "są nielegalne i są odrzucane .

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

+11

UWAGA! Wartość '(a, b, c, d)' nie zostanie odrzucona. Po prostu "d" zostanie odrzucone, co daje w wyniku wartość '(a, b, c)'. –

+2

To może być oficjalna dokumentacja, ale nadal jest to bardzo mylący sposób ich opisywania. Na podstawie innych odpowiedzi różnica staje się jasna. SET to tablica ENUM, gdzie każda wartość składa się z 0 lub więcej wartości stylu wyliczeniowego. – Jonathon

+1

To nie jest dobra odpowiedź. Postulowano jasne wyjaśnienie różnic i braków/zalet; oficjalna dokumentacja, której ta odpowiedź jest zwykłą kopią, nie spełnia tego warunku. – Smuuf

35

Enum and Set całkowicie zależy od wymagań, np. Jeśli masz listę przycisków, w których można wybrać tylko jedną, użyj Enum. A jeśli masz listę pól wyboru, w których można wybrać więcej niż jedną pozycję, użyj zestawu.

13
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żna skopiować powyższy kod i wklej go w mysql, a okaże się, że SET faktycznie jest zbiorem. Możesz przechowywać każdy kombinację deklarowanych atrybutów.

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. I okaże się, że każdy z nich może być przechowywany tylko raz za każdym razem. I przekonasz się, że wyniki ostatnich 2 linii będą puste.

78

analogia:
ENUM = pola radiowe (tylko przyjęte wartości są wymienione, można wybrać tylko jeden)
pola SET = checkbox (tylko przyjęte wartości są wymienione, można wybrać kilka)