MySQL 열거형(ENUM) 값과 표현식
MySQL에서 ENUM(열거형) 컬럼에 저장된 각 값은 내부적으로 인덱스 번호와 연결되어 있습니다. 이때 인덱스는 1부터 시작하며, 빈 문자열('')은 0, NULL은 NULL로 처리됩니다.
따라서 ENUM 값을 산술 표현식이나 집계 함수에 사용하면, MySQL은 문자열 자체가 아니라 연결된 인덱스 숫자를 기준으로 모든 계산을 수행합니다. 아래 예제를 통해 이 동작 방식을 확인해 보겠습니다.
예제 테이블 준비
mysql> Select * from Result; +-----+--------+-------+ | Id | Name | Grade | +-----+--------+-------+ | 100 | Gaurav | GOOD | | 101 | Rahul | POOR | | 102 | Rahul | NULL | | 103 | Mohan | | +-----+--------+-------+ 4 rows in set (0.00 sec)
위 테이블의 Grade 컬럼은 ENUM 타입으로 선언되어 있으며, 예를 들어 ENUM('POOR','GOOD')과 같이 정의되었다면 각 값의 인덱스는 다음과 같습니다.
- GOOD → 인덱스 2
- POOR → 인덱스 1
- NULL → NULL
- 빈 문자열('') → 인덱스 0
SUM() 함수에 ENUM 값 사용하기
mysql> Select SUM(Grade) from result; +------------+ | SUM(Grade) | +------------+ | 3 | +------------+ 1 row in set (0.00 sec)
SUM(Grade)의 결과가 3인 이유는, GOOD(2) + POOR(1) = 3으로 계산되었기 때문입니다. NULL과 빈 문자열 행은 합산에서 제외되거나 0으로 처리됩니다.
AVG() 함수에 ENUM 값 사용하기
mysql> Select AVG(Grade) from result; +------------+ | AVG(Grade) | +------------+ | 1 | +------------+ 1 row in set (0.00 sec)
AVG(Grade) 역시 인덱스 값을 기준으로 평균을 계산합니다. 유효한 인덱스 값(2와 1)의 평균이 계산되어 결과적으로 1이 반환됩니다.
산술 연산자와 함께 사용하기
mysql> Select Grade+0 from result; +---------+ | Grade+0 | +---------+ | 2 | | 1 | | NULL | | 0 | +---------+ 4 rows in set (0.00 sec) mysql> Select Grade-1 from result; +---------+ | Grade-1 | +---------+ | 1 | | 0 | | NULL | | -1 | +---------+ 4 rows in set (0.00 sec)
Grade+0 쿼리 결과를 보면 각 ENUM 값이 실제로 어떤 인덱스 숫자와 매핑되어 있는지 명확하게 드러납니다. GOOD은 2, POOR는 1, NULL은 그대로 NULL, 빈 문자열은 0으로 변환되었습니다. 마찬가지로 Grade-1 연산에서도 인덱스 값에서 1을 뺀 결과가 반환됩니다.
정리
이처럼 MySQL에서 ENUM 값을 표현식에 사용하면 문자열 비교가 아닌 내부 인덱스 숫자 기반의 산술 연산이 수행됩니다. 따라서 ENUM 컬럼을 수치 계산에 활용할 때는 각 값의 인덱스 매핑 규칙(1부터 시작, 빈 문자열은 0, NULL은 NULL 유지)을 반드시 기억해야 의도하지 않은 결과를 피할 수 있습니다.