MySQL에서 IP 주소를 저장하는 방법
MySQL에서 IP 주소는 INT UNSIGNED 데이터 유형으로 효율적으로 저장할 수 있습니다. IP 주소는 점(dot)으로 구분된 문자열 형태이지만, 이를 32비트 정수 값으로 변환하여 저장하면 저장 공간을 절약하고 조회 성능도 높일 수 있습니다.
이때 데이터를 삽입할 때는 INET_ATON() 함수를, 조회할 때는 INET_NTOA() 함수를 사용하면 됩니다. 각 함수의 역할은 다음과 같습니다.
- INET_ATON(): 점으로 구분된 IP 주소 문자열을 정수 값으로 변환합니다.
- INET_NTOA(): 정수 값을 다시 원래의 IP 주소 형식으로 변환합니다.
예제를 통해 실제 사용 방법을 살펴보겠습니다.
1. 테이블 생성
mysql> create table IPV4AddressDemo -> ( -> `IPV4Address` INT UNSIGNED -> ); Query OK, 0 rows affected (0.52 sec)
INT UNSIGNED 타입의 컬럼을 가진 테이블을 생성합니다. UNSIGNED로 지정하면 음수 값을 제외하고 0부터 4,294,967,295까지 저장할 수 있어 IPv4 주소 전체 범위를 커버할 수 있습니다.
2. IP 주소 삽입 (INET_ATON 사용)
mysql> insert into IPV4AddressDemo values(INET_ATON("120.0.0.1"));
Query OK, 1 row affected (0.17 sec)
INET_ATON() 함수를 사용하면 "120.0.0.1"이라는 IP 주소가 정수 값으로 변환되어 저장됩니다.
3. 저장된 데이터 조회
mysql> select *from IPV4AddressDemo;
조회 결과는 다음과 같습니다. 하지만 우리가 원하는 것은 당연히 읽기 쉬운 IP 주소 형식일 것입니다.
+-------------+ | IPV4Address | +-------------+ | 2013265921 | +-------------+ 1 row in set (0.00 sec)
위 출력 결과를 보면 IP 주소가 정수 값(2013265921)으로 저장되어 있는 것을 확인할 수 있습니다.
4. 원래 IP 주소 형식으로 변환 (INET_NTOA 사용)
정수로 저장된 값을 다시 원래의 IP 주소 형식으로 변환하려면 INET_NTOA() 함수를 사용합니다.
mysql> SELECT INET_NTOA(`IPV4Address`) FROM IPV4AddressDemo;
실행 결과, 실제 IP 주소 형식으로 정상적으로 표시되는 것을 확인할 수 있습니다.
+--------------------------+ | INET_NTOA(`IPV4Address`) | +--------------------------+ | 120.0.0.1 | +--------------------------+ 1 row in set (0.00 sec)
정리
MySQL에서 IPv4 주소를 저장할 때는 INT UNSIGNED 타입에 INET_ATON()과 INET_NTOA() 함수를 함께 사용하는 것이 효율적입니다. 문자열 형태(VARCHAR, 15자)로 저장하는 것보다 4바이트의 고정된 크기를 사용하므로 저장 공간이 절약되고, 정수 기반 비교 연산이 가능해 인덱싱과 검색 성능 면에서도 유리합니다.
참고로, 위 방법은 IPv4 주소에만 적용됩니다. IPv6 주소까지 저장해야 한다면 VARBINARY(16) 타입과 INET6_ATON(), INET6_NTOA() 함수를 사용하는 것이 좋습니다.