11.4.4 ENUM 형태
ENUM
은 테이블 생성시 컬럼 사양에 명시 적으로 열거 된 허용되는 값 목록에서 선택한 값을 가지는 문자열 객체입니다. 여기에는 다음과 같은 장점이 있습니다.
가능한 값의 집합이 컬럼에서 제한되어있는 상황에서 소형 데이터 저장. 입력 값으로 지정한 문자열에 숫자로 인코딩됩니다.
ENUM
형태의 스토리지 요구 사항은 섹션 11.7 "데이터 유형의 스토리지 요구 사항" 을 참조하십시오.읽기 쉬운 쿼리 및 출력. 수치는 쿼리 결과에서 해당 문자열로 반환됩니다.
또한 다음과 같은 고려가 필요한 문제가 발생할 수 있습니다.
Enumeration Limitations 에서 설명한대로 숫자처럼 보이는 열거 값을 만든 경우 리터럴 값과 내부 인덱스 번호를 혼동하기 쉽습니다.
Enumeration Sorting 에서 설명하고있는 바와 같이,
ORDER BY
절에서ENUM
컬럼을 사용하려면 특히주의가 필요합니다.
ENUM 컬럼의 생성과 사용
열거 값은 따옴표로 묶인 문자열 리터럴해야합니다. 예를 들어, 다음과 같이 ENUM
컬럼을 가진 테이블을 만들 수 있습니다.
CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') ); INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'), ('polo shirt','small'); SELECT name, size FROM shirts WHERE size = 'medium'; +---------+--------+ | name | size | +---------+--------+ | t-shirt | medium | +---------+--------+ UPDATE shirts SET size = 'small' WHERE size = 'large'; COMMIT;
'medium'
의 값을 가지는 100 만 개의 행이 테이블에 삽입하려면 100 만 바이트의 스토리지가 필요하지만 실제 문자열 'medium'
을 VARCHAR
컬럼에 저장하는 경우는 600 만 바이트 필요합니다.
열거 리터럴의 인덱스 값
각각의 열거 값은 인덱스가 설정되어 있습니다.
컬럼 사양에 나열되어있는 요소는 1부터 시작하는 인덱스가 할당되어 있습니다.
빈 문자열 오류 값의 인덱스 값은 0입니다. 즉, 다음
SELECT
문을 사용하여 잘못된ENUM
값이 할당 된 행을 검색 할 수 있습니다.mysql>
SELECT * FROM
tbl_name
WHEREenum_col
=0;NULL
값의 인덱스는NULL
입니다.여기에서 "인덱스"라는 용어는 열거 값의리스트 내에서의 위치를 나타냅니다. 이 테이블 인덱스와는 전혀 관계 없습니다.
예를 들어, ENUM('Mercury', 'Venus', 'Earth')
로 지정된 컬럼은 다음과 같은 값을 포함 할 수 있습니다. 각각의 값의 인덱스도 보여줍니다.
Value | Index |
---|---|
NULL | NULL |
'' | 0 |
'Mercury' | 1 |
'Venus' | 2 |
'Earth' | 3 |
ENUM
컬럼은 최대 65,535 개의 개별 요소를 포함 할 수 있습니다. (실제 한도는 3000 개까지입니다.) 테이블에는 그룹으로 간주되는 ENUM
및 SET
컬럼 안의 고유 요소 목록 정의를 255 개 이하를 포함 할 수 있습니다. 이러한 제한의 자세한 내용은 섹션 D.10.5 ".frm 파일 구조에 의해 부과되는 제한" 을 참조하십시오.
ENUM
값을 숫자 컨텍스트에서 취득한 경우, 컬럼 값의 인덱스를 반환합니다. 예를 들어, 다음과 같이 ENUM
컬럼에서 값을 가져올 수 있습니다.
mysql> SELECT enum_col
+0 FROM tbl_name
;
수치 인수를 SUM()
과 AVG()
등의 함수는 필요에 따라 인수를 숫자로 변환합니다. ENUM
값의 계산에는 인덱스 번호가 사용됩니다.
열거 리터럴 처리
테이블이 작성 될 때 테이블 정의의 ENUM
멤버 값에서 후행 공백이 자동으로 삭제됩니다.
ENUM
컬럼에 저장된 값은 취득한 때 컬럼 정의에서 사용 된 대 / 소문자로 표시됩니다. ENUM
컬럼은 문자 셋과 콜레 션을 할당합니다. 이진 데이터 정렬 또는 대소 문자 구분 데이터 정렬의 경우, 컬럼에 값을 할당 할 때 대 / 소문자가 고려됩니다.
ENUM
컬럼에 숫자를 저장하면 그 숫자는 가능한 값의 인덱스로 처리되며 저장된 값이 인덱스를 가지는 열거 멤버입니다. (그러나 이것은 모든 입력을 문자열로 취급 LOAD DATA
에서 작동하지 않습니다.) 수치가 따옴표로 둘러싸여 있으면 열거 값 목록에 일치하는 문자열이 없으면 그대로 인덱스로 해석됩니다 합니다. 이러한 이유로 ENUM
컬럼을 숫자처럼 보이는 열거 값으로 정의하는 것은 혼란을 초래하게되기 때문에 권장하지 않습니다. 예를 들어, 다음 열에는 '0'
, '1'
과 '2'
문자열 값을 가지는 열거 멤버가 지정되어 있지만 숫자 인덱스 값은 1
, 2
및 3
입니다.
numbers ENUM ( '0', '1', '2')
2
를 저장하면 그것은 인덱스 값으로 해석되며, '1'
(인덱스 2의 값)입니다. '2'
를 저장하면 그것은 열거 값과 일치하므로 '2'
로 저장됩니다. '3'
를 저장하면 어떤 열거 값과도 일치하지 않기 때문에 인덱스로서 다루어 져 '2'
(인덱스 3의 값)입니다.
mysql>INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql>SELECT * FROM t;
+---------+ | numbers | +---------+ | 1 | | 2 | | 2 | +---------+
ENUM
컬럼의 모든 가능한 값을 확인하려면, SHOW COLUMNS FROM
를 사용하여 출력 tbl_name
LIKE ' enum_col
'Type
컬럼의 ENUM
정의를 구문 분석합니다.
C API에서는 ENUM
값은 문자열로 반환됩니다. 결과 세트의 메타 데이터를 사용하여 이들을 다른 문자열에서 구분하는 방법은 섹션 23.8.5 "C API 데이터 구조" 를 참조하십시오.
비어 있거나 NULL 열거 값
다음과 같은 특정 상황에서는 열거 값은 빈 문자열 ( ''
)이나 NULL
이 될 수도 있습니다.
ENUM
에 잘못된 값 (즉, 허용 된 값의 목록에없는 문자열)을 삽입하면 특별한 에러 값으로 빈 문자열이 대신 삽입됩니다. 이 문자열이 문자열에 0의 값이 포함되어있는 것으로, 「보통」의 빈 문자열과 구분할 수 있습니다. 열거 값의 숫자 인덱스 자세한 내용은 Index Values for Enumeration Literals 를 참조하십시오.엄격한 SQL 모드가 활성화되면 잘못된
ENUM
값을 삽입하려고하면 오류가 발생합니다.ENUM
컬럼이NULL
을 허용하도록 선언 된 경우NULL
값은 그 컬럼에 대해 유효한 값이며 기본값은NULL
입니다.ENUM
컬럼이NOT NULL
로 선언되는 경우 기본값은 허용되는 값 목록의 첫 번째 요소입니다.
열거 정렬
ENUM
은 인덱스 번호에 따라 정렬되지만,이 수치는 열 사양에 열거 멤버가 나열되어 있지 순서에 따릅니다. 예를 들어, ENUM('b', 'a')
의 경우, 'b'
는 'a'
앞에 정렬됩니다. 빈 문자열은 비어 있지 않은 문자열 앞에 정렬되어 NULL
값은 다른 모든 열거 값 앞에 정렬됩니다.
ENUM
컬럼에 ORDER BY
절을 사용할 때 의외의 결과가되는 것을 방지하려면 다음 중 하나의 방법을 사용합니다.
알파벳순으로
ENUM
목록을 지정합니다.ORDER BY CAST(
또는col
AS CHAR)ORDER BY CONCAT(
를 코드화하여 컬럼이 인덱스 번호가 아니라 사전 순으로 정렬되는지 확인합니다.col
)
열거 제한
열거 값은 문자열 값으로 평가되는 것으로도 표현은 할 수 없습니다.
예를 들어, 다음의 CREATE TABLE
문은 CONCAT
함수를 열거 값의 구축에 사용할 수 없기 때문에 작동하지 않습니다.
CREATE TABLE sizes ( size ENUM ( 'small', CONCAT ( 'med', 'ium') 'large') );
사용자 변수를 열거 값으로 사용할 수 없습니다. 다음 문 쌍은 작동하지 않습니다.
SET @mysize = 'medium'; CREATE TABLE sizes ( size ENUM ( 'small', @mysize 'large') );
숫자를 열거 값으로 사용하지 않는 것이 좋습니다. 이것은 적절한 TINYINT
또는 SMALLINT
형보다 스토리지를 절약하는 것도 아니고, ENUM
값을 잘못 인용 부호로 묶인 경우에는 문자열과베이스가되는 수치와 혼동하기 쉬워진다 (동일하지 않은 경우 도 있습니다)부터입니다. 숫자를 열거 값으로 사용하는 경우에는 반드시 따옴표로 묶어야합니다. 따옴표를 생략 한 경우는 그 숫자 인덱스로 간주됩니다. Handling of Enumeration Literals 를 참조하여 인용 된 숫자도 잘못 숫자 인덱스 값으로 사용되거나 경우에 대해 확인하십시오.
정의에 중복 된 값이 포함되어 있으면 경고 (엄격한 SQL 모드가 활성화되어 있으면 오류)가 발생합니다.