반응형

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 칼럼에 들어갈 있는 값과 인덱스 값은 다음과 같이 기대할 있다.


인덱스 칼럼 입력
NULL NULL
0 '' 잘못 입력된 대신 들어가는
1 a
2 b
3 c
4 d
5 e

 

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      |
+----+-----------+

 

반응형

+ Recent posts