MySQL enum type

Woody·2024년 9월 22일

TIL

목록 보기
15/19

배경

사이드 프로젝트의 DDL을 살펴보다가 MySQL에 enum 타입이 있는 것을 보았다. 더 놀라운 건 문자열 형식으로 데이터가 저장되는데, 단순히 1bytes로 저장되는 것이다.

enum 타입이 무엇인지 궁금해 이를 알아보려 한다.

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 타입의 장점

  1. enum 타입은 단 1bytes만 차지하기 때문에 데이터 공간을 절약할 수 있다.
  2. 쿼리 결과로는 문자열로 보이기 때문에 가독성이 좋다.

enum 타입의 단점

  1. enum 타입의 값을 수정, 추가, 제거할 때, 모든 데이터를 돌면서 수정하기 때문에 데이터양이 많은 경우 시간이 오래 소모될 수 있다.

  2. enum 타입이 숫자일 때, 데이터를 문자열로 추가하지 않는다면 원하지 않은 값이 들어갈 수 있다.

  3. enum 타입은 일부 DBMS에만 있기 때문에 다른 DBMS로 이전할 때 마이그레이션 과정이 더욱 복잡해진다.

결론

1bytes의 장점이 있기 때문에 enum 타입의 값이 절대로 바뀌지 않을 확신이 있을 때만 사용하면 좋을 것 같다.

변경 가능성이 있거나 숫자일 경우엔 참조 테이블을 만들어서 사용하는 것이 좋을 것 같다.


13.3.5 The ENUM Type - MySQL Docs

MySQL Enum에 대한 정리

8 Reasons Why MySQL's ENUM Data Type Is Evil

0개의 댓글