728x90
반응형
enum 데이터 타입은 캐릭터형 데이터 타입이며, 해당 칼럼에 들어올 수 있는 값을 지정해 줄 수 있다. 테이블 생성 시 주어 진 list안의 데이터만 값을 입력 받고, 잘못 된 데이터는 '' 값으로 처리 하는 데이터 타입이다. 간단하게 비유 하자면 체크 제약 조건이라고 보면 된다.
해당 칼럼에 NOT NULL 조건이 없으면 들어갈 수 있는 데이터 값으로는 NULL , '' , List에 지정된 문자 가 칼럼에 값으로 들어갈 수 있다.
enum 카럼은 값으로도 조회가 가능하지만, 칼럼의 값(list)의 index값으로도 제어가 가능하다.
칼럼의 index로 데이터를 제어가 가능한 것은 장점이 될 수도 있고, 단점이 될 수도 있다.
칼럼에서 list의 순서가 변경 된다면, 칼럼의 index가 변경이 되어서, index를 가지고 insert나 select를 할 경우 기존과 다른 값을 입력하거나 조회 할 수 있게 된다.
1. 테스트 테이블 생성
CREATE TABLE test_enum (id int NOT NULL , type_enum enum ('a','b','c','d','e') ) ; 위와 같이 생성 시에 type_enum 칼럼에 들어갈 수 있는 값과 인덱스 값은 다음과 같이 기대할 수 있다.
|
2. 테스트
#정상적인 데이터 Insert INSERT INTO test_enum VALUES (1,'c'),(2,'a'),(3,'A'),(4,'e'),(5,1),(6,null); COMMIT ; SELECT id , type_enum , type_enum+0 FROM test_enum ; id type_enum type_enum+0 1 c 3 2 a 1 3 a 1 4 e 5 5 a 1 6 null null id가 5인 경우, 값이 아니라 인덱스 1값인 a가 Insert가 되었다. # 리스트에 없는 데이터 Insert INSERT INTO test_enum VALUES (7,'z') ; COMMIT ; SELECT id , type_enum , type_enum+0 FROM test_enum ; id type_enum type_enum+0 1 c 3 2 a 1 3 a 1 4 e 5 5 a 1 6 null null 7 0 enum 리스트에 없는 데이터는 '' 값으로 들어가며, Index값은 0이다. # enum 리스트에 새로운 값 추가(제일 뒤) ALTER TABLE test_enum MODIFY type_enum enum ('a','b','c','d','e','z') ; INSERT INTO test_enum VALUES (8,'z') ; COMMIT ; SELECT id , type_enum , type_enum+0 FROM test_enum ; id type_enum type_enum+0 1 c 3 2 a 1 3 a 1 4 e 5 5 a 1 6 null null 7 0 8 z 6 리스트에 값을 추가 한 후에 추가된 값이 정상적으로 Insert 되는 것을 확인 할 수 있음. # 칼럼 값 조회 SELECT * FROM test_enum WHERE type_enum = 1 ; id type_enum 2 a 3 a 5 a SELECT * FROM test_enum WHERE type_enum = 'a' ; id type_enum 2 a 3 a 5 a SELECT * FROM test_enum WHERE type_enum = 'A' ; id type_enum 2 a 3 a 5 a 칼럼 값의 대소 문자를 가리지 않고 조회 됨. # 리스트의 값은 같지만, 리스트 순서를 변경 함. 이 경우 입력할 수 있는 값은 똑같지만, 값의 인덱스가 변경이 된다. ALTER TABLE test_enum MODIFY type_enum enum ('z','e','d','c','b','a') ; COMMIT ; SELECT id , type_enum , type_enum+0 FROM test_enum ; id type_enum type_enum+0 1 c 4 2 a 6 3 a 6 4 e 2 5 a 6 6 null null 7 0 8 z 1 테이블에 들어있는 칼럼의 값은 변화가 없지만, 인덱스 값의 변화가 있음을 확인 할 수 있다. SELECT * FROM test_enum WHERE type_enum = 1 ; id type_enum 8 z 기존의 인덱스 1의 값은 a 였으나, 변경된 인덱스 1의 값은 z 임을 다시 확인 할 수 있다. enum 사용시 주의 해야 할 부분. # 조회시에 대소문자를 가리지 않는 것으로 확인이 되어서, Insert 시에도 가리지 않는지 확인 ALTER TABLE test_enum MODIFY type_enum enum ('z','e','d','c','b','a','A') ; SELECT * FROM test_enum WHERE type_enum = 'A' ; id type_enum 2 a 3 a 5 a SELECT * FROM test_enum WHERE type_enum = 'a' ; id type_enum 2 a 3 a 5 a INSERT INTO test_enum VALUES (9,'A') ; COMMIT ; SELECT id , type_enum , type_enum+0 FROM test_enum ; id type_enum type_enum+0 1 c 4 2 a 6 3 a 6 4 e 2 5 a 6 6 null null 7 0 8 z 1 9 a 6 대문자 A를 입력했는데, 값은 a로 들어 감. SELECT * FROM test_enum WHERE type_enum = 'A' ; id type_enum 2 a 3 a 5 a 9 a SELECT * FROM test_enum WHERE type_enum = 'a' ; id type_enum 2 a 3 a 5 a 9 a INSERT INTO test_enum VALUES (10,7) ; COMMIT ; SELECT id , type_enum , type_enum+0 FROM test_enum ; id type_enum type_enum+0 1 c 4 2 a 6 3 a 6 4 e 2 5 a 6 6 null null 7 0 8 z 1 9 a 6 10 A 7 SELECT * FROM test_enum WHERE type_enum = 'A' ; id type_enum 2 a 3 a 5 a 9 a 10 A SELECT * FROM test_enum WHERE type_enum = 'a' ; id type_enum 2 a 3 a 5 a 9 a 10 A 동일한 문자의 대소는 가리지 않고 값으로 조회가 가능 함. enum을 사용 시 주의 해야 할 부분 # 대소문자가 섞여 있는 리스트를 생성해 봄 ALTER TABLE test_enum MODIFY type_enum enum ('z','e','d','c','b','a','AbCd') ; INSERT INTO test_enum VALUES (11,'abcd') ; INSERT INTO test_enum VALUES (12,'ABCD') ; INSERT INTO test_enum VALUES (13,'aBcD') ; COMMIT; SELECT id , type_enum , type_enum+0 FROM test_enum ; id type_enum type_enum+0 1 c 4 2 a 6 3 a 6 4 e 2 5 a 6 6 null null 7 0 8 z 1 9 a 6 10 a 6 11 AbCd 7 12 AbCd 7 13 AbCd 7 SELECT * FROM test_enum WHERE type_enum = 'AbCd' ; id type_enum 11 AbCd 12 AbCd 13 AbCd SELECT * FROM test_enum WHERE type_enum = 'abcd' ; id type_enum 11 AbCd 12 AbCd 13 AbCd SELECT * FROM test_enum WHERE type_enum = 'ABCD' ; id type_enum 11 AbCd 12 AbCd 13 AbCd |
3. enum 칼럼에 지정된 값 이외에는 들어가지 않게 제한 주기
# 테이블 구조 확인 MariaDB [maria5]> desc test_enum ; +-----------+------------------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------------------------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | type_enum | enum('z','e','d','c','b','a','A','AbCd') | YES | | NULL | | +-----------+------------------------------------------+------+-----+---------+-------+ # SQL_MODE 확인 MariaDB [maria5]> select @@sql_mode ; +------------+ | @@sql_mode | +------------+ | | +------------+ MariaDB [maria5]> insert into test_enum values (15,'y'),(16,'x') ; MariaDB [maria5]> select * from test_enum ; +----+-----------+ | id | type_enum | +----+-----------+ | 1 | c | | 2 | a | | 3 | a | | 4 | e | | 5 | a | | 6 | NULL | | 7 | | | 8 | z | | 9 | a | | 10 | A | | 11 | AbCd | | 12 | AbCd | | 13 | AbCd | | 14 | | | 15 | | | 16 | | +----+-----------+ # SQL_MODE 변경 MariaDB [maria5]> set global sql_mode ='STRICT_TRANS_TABLES' ; MariaDB [maria5]> show global variables like '%sql_mode%' ; +---------------+---------------------+ | Variable_name | Value | +---------------+---------------------+ | sql_mode | STRICT_TRANS_TABLES | +---------------+---------------------+ 앞으로 로그인 하는 세션들은 영향을 받음. [root@CMaria ~]# mysql5 -uroot -p MariaDB [maria5]> insert into test_enum values (17 ,'y') ; <-- 리스트에 없는 값 에러 발생 ERROR 1265 (01000): Data truncated for column 'type_enum' at row 1 MariaDB [maria5]> insert into test_enum values (17 ,'ABCD') ; <-- 여전히 대소문자는 구별 안 함 Query OK, 1 row affected (0.08 sec) MariaDB [maria5]> select * from test_enum ; +----+-----------+ | id | type_enum | +----+-----------+ | 1 | c | | 2 | a | | 3 | a | | 4 | e | | 5 | a | | 6 | NULL | | 7 | | | 8 | z | | 9 | a | | 10 | A | | 11 | AbCd | | 12 | AbCd | | 13 | AbCd | | 14 | | | 15 | | | 16 | | | 17 | AbCd | +----+-----------+ |
반응형