본문 바로가기

SQL Server/SQL Server Tip & Tech

IP주소를 저장하는 방법 몇 가지. - IPv4

IP주소를 저장하기 위해 사용하는 데이터 타입은 무엇이 적당할까?

 

1.     1개의 VARCHAR(15) 컬럼

A.     장점

                                 i.         가독성이 높다.

                                ii.         테이블 레이아웃이 간단하다.

B.      단점

                                 i.         저장 공간 비용이 높다. (7 ~ 15Byte)

                                ii.         정렬 및 범위 검색이 어렵다.

2.     4개의 TINYINT 컬럼

A.     장점

                                 i.         저장 공간을 줄일 수 있다. (4Byte)

                                ii.         정렬 및 검색이 쉽다.

                               iii.         가독성이 좋은 편이다.

B.      단점

                                 i.         IP주소 문자열과의 변환 비용이 존재한다.

                                ii.         테이블 레이아웃이 복잡해진다.

3.     1개의 INT 컬럼

A.     장점

                                 i.         저장 공간을 줄일 수 있다. (4Byte)

                                ii.         정렬 및 검색이 쉽다.

                               iii.         테이블 레이아웃이 간단하다.

B.      단점

                                i.         가독성이 매우 낮다.

4.     1개의 VARCHAR(15) 컬럼 + 1개의 INT 컬럼

A.     1번과 3번을 모두 사용하는 방식

B.      장점

                                 i.         정렬 및 검색이 쉽다.

                                ii.         가독성이 높다.

                               iii.         테이블 레이아웃이 간단한 편이다.

                               iv.         Read의 경우 별도의 변환이 필요하지 않다. (이미 변환된 두 가지 타입을 저장)

C.      단점

                                 i.         저장 공간 비용이 높다. (11 ~ 19Byte)

 

3번이나 4번을 사용하는 경우, 변환을 위한 UDF가 필요하다.

 

- IP주소를 int형으로 변환하기.

 

CREATE FUNCTION dbo.FN_IP2IPNumber (

  @vchIP varchar(15)

)

RETURNS int

AS

BEGIN

RETURN

  ((CAST(PARSENAME(@vchIP, 4) AS int) - 128) * 16777216) +

  (CAST(PARSENAME(@vchIP, 3) AS int) * 65536) +

  (CAST(PARSENAME(@vchIP, 2) AS int) * 256) +

  CAST(PARSENAME(@vchIP, 1) AS int);

END

GO

 

 

- int형으로 변환된 IP주소를 문자열로 변환하기.

 

CREATE FUNCTION dbo.FN_IPNumber2IP (

  @intIPNumber int

)

RETURNS varchar(15)

AS

BEGIN

  RETURN

    CAST(((@intIPNumber & 0xFF000000) / 16777216) + 128 AS varchar(3)) + '.' +

    CAST((@intIPNumber & 0x00FF0000) / 65536 AS varchar(3)) + '.' +

    CAST((@intIPNumber & 0x0000FF00) / 256 AS varchar(3)) + '.' +

    CAST((@intIPNumber & 0x000000FF) AS varchar(3));

END

GO