MySQL 열거 형 대 집합


88

"enum"및 "set"의 MySQL 데이터 유형의 경우 하나를 사용하는 것의 차이점과 장단점은 무엇입니까?

데이터 유형의 예 :

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

내가 아는 유일한 차이점은 ENUM은 하나의 값만 선택할 수있는 반면 SET는 여러 값을 선택할 수 있다는 것입니다.


5
adv / disadv가 없습니다. 요구 사항에 따라 그중 하나를 선택해야합니다.
ravnur

1
두 유형은 관련이 없습니다. int 또는 text 중 어느 것이 더 나은지 물어 보는 것이 좋습니다.
보헤미안

답변:


66

현상태대로 MySQL의 문서 상태 :

ENUM 또는 SET 열의 정의는 열에 입력 된 값에 대한 제약으로 작용합니다. 다음 조건을 충족하지 않는 값에 대해 오류가 발생합니다.

ENUM 값은 열 정의에 나열된 값 중 하나이거나 이에 상응하는 내부 숫자 여야합니다. 값은 오류 값 (즉, 0 또는 빈 문자열)이 될 수 없습니다. ENUM ( 'a', 'b', 'c')로 정의 된 열의 경우 '', 'd'또는 'ax'와 같은 값은 잘못되어 거부됩니다.

SET 값은 빈 문자열이거나 쉼표로 구분 된 열 정의에 나열된 값으로 만 구성된 값이어야합니다. SET ( 'a', 'b', 'c')로 정의 된 열의 경우 'd'또는 'a, b, c, d'와 같은 값은 잘못되어 거부됩니다.


22
노트! 의 값은 (a, b, c, d)거부되지 않습니다. 그냥 d거부되므로 값이 발생합니다 (a, b, c).
Itay Grudev 2014

3
이것은 공식 문서 일 수 있지만 여전히이를 설명하는 매우 혼란스러운 방법입니다. 다른 답변을 바탕으로 차이점이 분명해집니다. SET는 각 값이 0 개 이상의 열거 형 스타일 값으로 구성된 ENUM의 배열입니다.
Jonathon 2015

9
이것은 좋은 대답이 아닙니다. 차이점과 단점에 대한 명확한 설명이 요구되었습니다. 이 답변이 단순한 사본 인 공식 문서는 그렇게하지 못합니다.
Smuuf

(a, b, c, d)는 Strict 모드가 켜져 있으면 거부됩니다
Chinmay

2
이것은 답이 아닙니다.
Amit Shah

197

비유 :
ENUM = 라디오 필드 (승인 된 값만 나열된 항목, 하나만 선택할 수 있음)
SET = 확인란 필드 (승인 된 값만 나열된 항목, 여러 개를 선택할 수 있음)


5
깨끗하고 이해하기 쉽습니다!
Abu Shoeb

이것은 명확하게 설명 된 정확한 차이입니다. 감사합니다 @Brad Kent
Ravi Teja

44

Enum 및 Set는 한 번에 하나만 선택할 수있는 라디오 버튼 목록이있는 경우 Enum을 사용하는 것과 같이 요구 사항에 전적으로 의존합니다. 한 번에 하나 이상의 항목을 선택할 수있는 확인란 목록이있는 경우 set를 사용합니다.


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

위의 코드를 복사하여 mysql에 붙여 넣으면 SET이 실제로 컬렉션 이라는 것을 알 수 있습니다. 선언 한 속성의 각 조합을 저장할 수 있습니다.

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

위의 코드를 복사 할 수도 있습니다. 그리고 각 ENUM은 실제로 매번 한 번만 저장할 수 있습니다. 그리고 마지막 두 줄의 결과가 모두 비어 있음을 알 수 있습니다.


9

사실 매우 간단합니다.

ENUM ( 'Yes', 'No', 'Maybe') 를 정의 할 때 이러한 값 중 하나 (또는 ​​해당 위치 인덱스 번호) 만 삽입 해야합니다.

당신이 정의 할 때 SET ( 'R', 'W'를, 'X'는) 당신은 할 수 빈 문자열을 삽입, 또는 하나 이상의 이러한 값. 미리 정의 된 집합에없는 것을 삽입하면 대신 빈 문자열이 삽입됩니다. 삽입하기 전에 모든 중복 값이 ​​삭제되므로 허용되는 각 값의 인스턴스가 하나만 삽입됩니다.

이것이 해결되기를 바랍니다.

Winbobob의 대답은 정확하지 않으며 여러 값을 삽입 할 때 값이 쉼표로 구분 된 문자열이어야하므로 잘못된 예가 포함되어 있습니다. 그의 모든 삽입물은 실제로 단일 값만 삽입하고 있으며 마지막 두 개는 정의 된 집합에 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.