사이드 프로젝트의 DDL을 살펴보다가 MySQL에 enum 타입이 있는 것을 보았다. 더 놀라운 건 문자열 형식으로 데이터가 저장되는데, 단순히 1bytes로 저장되는 것이다.
enum 타입이 무엇인지 궁금해 이를 알아보려 한다.
Java의 Enum 타입과 마찬가지로 MySQL에서 해당 column에 들어갈 수 있는 값을 제한하는 타입이다.
문자열이 자동으로 숫자로 인코딩되어 저장되기 때문에 1bytes로 저장된다. 쿼리 결과에는 숫자가 아닌 다시 문자열로 표시된다.
enum(’a’, ‘b’, ‘c’)인 경우 첫 번째 값부터 인덱스가 1로 시작한다. (’a’의 인덱스 1, ‘b’의 인덱스 2 …)
특징
빈 문자열과 null 값이 들어갈 수 있고, 잘못된 값을 enum 타입에 삽입하면 빈 문자열로 들어간다. (SQL 모드가 strict라면 오류 반환)
enum 타입의 정렬은 값의 인덱스에 따라 정렬된다. null과 빈 문자열의 경우 가장 앞 순서로 정렬되며, ‘null > 빈 문자열 > enum 값’순으로 정렬된다.
enum에 숫자를 사용하는 것은 권장하지 않는다. enum 타입이 숫자인 경우 해당 숫자가 인덱스로 해석될 수 있기 때문이다. 만약 숫자로 사용하는 경우엔 항상 리터럴(‘ ’)로 값을 추가해야 한다.
ex) enum(’0’,’1’,’2’) 인 경우 실수로 1을 추가하면, ‘1’이 아닌 첫 번째 값인 ‘0’이 추가된다.
enum 타입의 값을 수정, 추가, 제거할 때, 모든 데이터를 돌면서 수정하기 때문에 데이터양이 많은 경우 시간이 오래 소모될 수 있다.
enum 타입이 숫자일 때, 데이터를 문자열로 추가하지 않는다면 원하지 않은 값이 들어갈 수 있다.
enum 타입은 일부 DBMS에만 있기 때문에 다른 DBMS로 이전할 때 마이그레이션 과정이 더욱 복잡해진다.
1bytes의 장점이 있기 때문에 enum 타입의 값이 절대로 바뀌지 않을 확신이 있을 때만 사용하면 좋을 것 같다.
변경 가능성이 있거나 숫자일 경우엔 참조 테이블을 만들어서 사용하는 것이 좋을 것 같다.