Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 IP 주소를 저장하는 최적의 데이터 유형은 무엇일까?

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() 함수를 사용하는 것이 좋습니다.