IP 주소는 문자열 그대로 정렬하면 의도와 다른 순서가 나올 수 있습니다. 예를 들어 '192.168.110.87'이 '192.168.110.78'보다 앞에 오는 등 사전순 비교 때문에 어색한 결과가 발생합니다. 이 문제를 해결하려면 MySQL의 INET_ATON() 함수를 활용하면 됩니다.
INET_ATON() 함수란?
INET_ATON()은 IP 주소 문자열을 숫자 값으로 변환하는 함수입니다. IP 주소를 숫자로 바꾼 뒤 ORDER BY 절을 적용하면, 사람이 인식하기 자연스러운 올바른 순서대로 레코드를 정렬할 수 있습니다.
1. 테이블 생성
먼저 IP 주소를 저장할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
-> (
-> IpAddress varchar(50)
-> );
Query OK, 0 rows affected (1.36 sec)
2. 데이터 삽입
INSERT 명령으로 샘플 IP 주소 몇 개를 입력합니다.
mysql> insert into DemoTable values('192.168.110.78');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('192.168.110.87');
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values('192.168.110.75');
Query OK, 1 row affected (0.26 sec)3. 전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----------------+
| IpAddress |
+----------------+
| 192.168.110.78 |
| 192.168.110.87 |
| 192.168.110.75 |
+----------------+
3 rows in set (0.00 sec)
현재는 삽입된 순서 그대로 출력되며, 마지막에 넣은 75가 맨 아래에 있는 것을 볼 수 있습니다.
4. INET_ATON()으로 정렬하기
이제 IP 주소를 기준으로 올바르게 정렬하는 쿼리입니다. ORDER BY 절 안에서 inet_aton() 함수를 호출합니다.
mysql> select *from DemoTable
-> order by inet_aton(IpAddress);
실행 결과는 다음과 같습니다.
+----------------+
| IpAddress |
+----------------+
| 192.168.110.75 |
| 192.168.110.78 |
| 192.168.110.87 |
+----------------+
3 rows in set (0.00 sec)
정리
문자열 상태의 IP 주소를 단순히 ORDER BY 하면 사전순(lexicographic) 비교가 적용되어 잘못된 순서가 나올 수 있습니다. 반면 INET_ATON()으로 IP 주소를 숫자로 변환한 뒤 정렬하면 각 옥텟(octet)의 실제 크기를 기준으로 정확하게 오름차순 정렬됩니다. 내림차순이 필요하다면 쿼리 끝에 DESC를 붙이면 됩니다.