MySQL에서 숫자 값을 저장할 때 ENUM과 TINYINT UNSIGNED 중 어떤 데이터 유형을 선택해야 할지 고민되는 경우가 많습니다. 두 유형의 차이를 이해하고 상황에 맞게 선택하는 것이 중요합니다.
ENUM과 TINYINT UNSIGNED의 선택 기준
저장할 값이 미리 정해져 있는 경우에는 ENUM 데이터 유형을 사용하는 것이 가장 좋습니다. ENUM은 허용된 값만 입력할 수 있도록 제한하기 때문에 더 엄격한 데이터 무결성을 보장합니다.
반면, 저장될 값이 사전에 알 수 없는 경우에는 TINYINT UNSIGNED 데이터 유형을 사용해야 합니다. TINYINT UNSIGNED는 특정 값으로 제한하지 않으므로 더 유연하게 사용할 수 있습니다.
ENUM 데이터 유형 구현 예제
10, 20, 30이라는 세 개의 값만 저장하려는 경우 ENUM을 활용하는 방법을 살펴보겠습니다.
1. 테이블 생성
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number ENUM('10','20','30')
);
Query OK, 0 rows affected (0.24 sec)2. 레코드 삽입
mysql> insert into DemoTable(Number) values('10');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(Number) values('20');
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable(Number) values('30');
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable(Number) values('50');
ERROR 1265 (01000): Data truncated for column 'Number' at row 1위 예시에서 볼 수 있듯이, ENUM에 정의되지 않은 값 '50'을 삽입하려고 하면 ERROR 1265 오류가 발생하며 데이터가 거부됩니다. 이것이 ENUM이 제공하는 강력한 데이터 검증 기능입니다.
3. 결과 확인
mysql> select *from DemoTable;
+----+--------+ | Id | Number | +----+--------+ | 1 | 10 | | 2 | 20 | | 3 | 30 | +----+--------+ 3 rows in set (0.00 sec)
TINYINT UNSIGNED 데이터 유형 구현 예제
이번에는 TINYINT UNSIGNED를 사용하는 방법을 살펴보겠습니다. 새로운 테이블을 생성합니다.
1. 테이블 생성
mysql> create table DemoTable ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Number tinyint unsigned ); Query OK, 0 rows affected (0.23 sec)
2. 레코드 삽입
mysql> insert into DemoTable(Number) values(100); Query OK, 1 row affected (0.07 sec) mysql> insert into DemoTable(Number) values(50); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable(Number) values(60); Query OK, 1 row affected (0.06 sec) mysql> insert into DemoTable(Number) values(70); Query OK, 1 row affected (0.07 sec)
TINYINT UNSIGNED는 0부터 255까지의 모든 양수를 허용하므로, 어떤 값이든 오류 없이 정상적으로 삽입됩니다.
3. 결과 확인
mysql> select *from DemoTable;
+----+--------+ | Id | Number | +----+--------+ | 1 | 100 | | 2 | 50 | | 3 | 60 | | 4 | 70 | +----+--------+ 4 rows in set (0.00 sec)
정리
ENUM은 값의 범위가 명확하게 정해져 있고 잘못된 값의 입력을 원천적으로 차단하고 싶을 때 적합하며, TINYINT UNSIGNED는 값이 다양하거나 향후 변경 가능성이 있을 때 더 나은 선택입니다. 스토리지 측면에서 ENUM은 내부적으로 정수로 저장되어 효율적이지만, 값 목록을 변경하려면 ALTER TABLE 작업이 필요하다는 점도 함께 고려하면 좋습니다.