MySQL에서 각 ENUM 값은 고유한 인덱스 번호와 연결되어 있으며, ENUM 값의 정렬 기준도 바로 이 인덱스 번호입니다. 인덱스 번호는 컬럼을 정의할 때 열거 멤버를 나열한 순서에 따라 결정됩니다.
예를 들어 ENUM('GOOD', 'EXCELLENT')로 정의된 컬럼에서는 'GOOD'이 'EXCELLENT'보다 먼저 정렬됩니다. 다시 말해 'GOOD'의 인덱스 번호는 1이고, 'EXCELLENT'의 인덱스 번호는 2입니다.
NULL과 빈 문자열의 정렬 순서
MySQL은 ENUM 컬럼에 빈 문자열('')과 NULL 값도 저장할 수 있습니다. 이 경우 정렬 시 빈 문자열은 일반 문자열보다 앞에 위치하고, NULL은 빈 문자열보다 더 앞에 위치합니다. 따라서 ENUM 값의 전체적인 정렬 순서는 다음과 같습니다.
| ENUM 값의 정렬 순서 |
| 1. NULL |
| 2. 빈 문자열 ('') |
| 3. 비어 있지 않은 문자열 (인덱스 번호순) |
예제로 확인하는 ENUM 정렬
다음 예제는 ENUM 타입의 'grade' 컬럼을 가진 'result' 테이블입니다. 테이블에는 아래와 같은 데이터가 저장되어 있습니다.
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)
이제 ORDER BY 절을 사용해 grade 컬럼을 기준으로 정렬해 보겠습니다. MySQL은 인덱스 번호를 기준으로 정렬된 결과를 반환합니다.
mysql> Select * from result order by grade; +-----+--------+-------+ | Id | Name | Grade | +-----+--------+-------+ | 102 | Rahul | NULL | | 103 | Mohan | | | 101 | Rahul | POOR | | 100 | Gaurav | GOOD | +-----+--------+-------+ 4 rows in set (0.00 sec)
출력 결과를 보면 NULL 값이 가장 먼저, 그다음 빈 문자열, 마지막으로 일반 문자열이 인덱스 번호 순으로 정렬된 것을 확인할 수 있습니다. 만약 ENUM 값을 알파벳 순서가 아닌 선언 순서가 아닌 다른 방식으로 정렬하고 싶다면, ORDER BY CAST(grade AS CHAR)처럼 명시적으로 문자열로 변환하여 정렬하는 방법도 활용할 수 있습니다.