IP 주소는 문자열이기 때문에 단순히 ORDER BY를 사용하면 문자열 기준으로 정렬되어 의도하지 않은 순서가 나올 수 있습니다. 예를 들어 '192.168.110.9'는 '192.168.110.10'보다 뒤에 위치해야 하지만, 문자열 비교에서는 앞에 오게 됩니다.
이 문제를 해결하려면 MySQL의 INET_ATON() 함수를 사용하면 됩니다. 이 함수는 IP 주소를 숫자 값으로 변환해 주기 때문에, 변환된 숫자를 기준으로 ORDER BY를 적용하면 네트워크 순서대로 올바르게 정렬할 수 있습니다.
1. 테이블 생성하기
먼저 IP 주소를 저장할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> IpAddress varchar(50)
-> );
Query OK, 0 rows affected (1.36 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 테이블에 몇 개의 레코드를 추가합니다.
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)
4. INET_ATON()으로 IP 주소 정렬하기
이제 INET_ATON() 함수를 활용해 IP 주소 레코드를 정렬하는 쿼리를 실행합니다.
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)
정리
INET_ATON()은 IPv4 주소를 4바이트 부호 없는 정수로 변환하는 함수입니다. 각 옥텟(점으로 구분된 숫자)을 수학적으로 비교할 수 있는 값으로 바꿔주기 때문에, IP 주소를 실제 네트워크 대역 순서대로 정렬할 때 매우 유용합니다. 반대로 숫자를 다시 IP 주소 형식으로 변환하고 싶다면 INET_NTOA() 함수를 사용하면 됩니다.