SQL Server에 IP 주소를 저장하는 데 가장 적합한 데이터 유형은 무엇입니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1038950

문제

이 질문은 이미 여기에 답이 있습니다.

SQL Server에 IPv4 주소를 저장하는 데 가장 권장되는 데이터 타입은 무엇입니까?

아니면 누군가가 이미 사용자 SQL 데이터 유형 (.NET 어셈블리)을 만들었을 수도 있습니까?

정렬이 필요하지 않습니다.

도움이 되었습니까?

해결책

IPv4 주소를 a로 저장합니다 binary(4)는 그것이 대표하는 것에 가장 진실되어 있으며 쉽게 서브넷 마스크 스타일 쿼리를 허용합니다. 그러나 실제로 텍스트 표현 후에있는 경우 전환 및 출력이 필요합니다. 이 경우 문자열 형식을 선호 할 수 있습니다.

문자열로 저장하는 경우 도움이 될 수있는 약간 사용되는 SQL 서버 기능 PARSENAME, 그런데. IP 주소 용으로 설계되지 않았지만 완벽하게 적합합니다. 아래 전화는 '14'를 반환합니다.

SELECT PARSENAME('123.234.23.14', 1)

(번호는 오른쪽에서 왼쪽입니다).

다른 팁

나는 일반적으로 IPv4 주소에 varchar (15)를 사용하지만 분류하는 것은 당신이 0을 만들지 않으면 고통입니다.

나는 또한 과거에 int로 저장했습니다. System.Net.IPAddress a GetAddressBytes IP 주소를 IP 주소를 나타내는 4 바이트 배열로 반환하는 메소드. 다음 C# 코드를 사용하여 변환 할 수 있습니다. IPAddress an int...

var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);

나는 Dupe 주소를 검색하는 데 많은 노력을 기울여야했기 때문에 그것을 사용했고, 인덱스가 가능한 작고 빠르기를 원했습니다. 그런 다음 주소를 int에서 다시 가져 와서 IPAddress .NET의 객체를 사용하십시오 GetBytes 메소드 켜짐 BitConverter int를 바이트 배열로 가져옵니다. 바이트 배열을 전달하십시오 건설자 ~을 위한 IPAddress 바이트 배열이 필요하고 다시 끝납니다. IPAddress 당신이 시작한 것.

var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));

수락 된 답변 에서이 의견과 관련하여

분류하는 것은 0을 패드하지 않으면 고통입니다.

다음은 SQL Server 2008에 대한 트릭입니다 (Itzik Ben-Gan에서 이 책)

with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address 
)
select ip_address
from ip_addresses
ORDER  BY CAST('/' + ip_address + '/' AS hierarchyid)

보고

ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201

내가 가장 좋아하는 것 중 하나 조항 정규 표현식을 사용하여 IP 주소를 구문 분석하지 않아야하는 이유에 대해 이야기합니다. 그들이 말하는 것의 대부분은 왜 IP 주소의 텍스트 표현에 매우주의 해야하는지 설명하는 것입니다. 데이터베이스에서 어떤 데이터 타입을 사용할 것인지 결정하기 전에 읽고 앱을 처리 할 때도 할 수도 있습니다 (기사가 Perl에 대해 작성되었지만 모든 언어에 유용합니다).

결국 32 비트 데이터 유형 (또는 4 개의 8 비트 데이터 유형)이 최선의 선택이라고 생각합니다.

IPv4? int? 또는 Tinyint x 4?

실제로 저장 및 검색인지 또는 원거리 검색 기준이 될지 여부에 따라 다릅니다.

IPv6을 잊지 마십시오. 저장 해야하는 경우 더 많은 공간이 필요합니다. 128bits는 IPv4의 32와 비교됩니다.

나는 Bigint에 갈 것입니다.하지만 인간 친화적 인 버전으로 번역하려면 약간의 도우미 코드가 필요할 것입니다.

나는 여기에서 비슷한 질문을 많이 읽고 있습니다.이 답변 중 어느 것도 다른 사람들의 답변을 언급하지 않았습니다. "IPv4 주소의 경우, int 서명 된 사람으로 저장하고 inet_aton () 및 사용을 원할 수도 있습니다. inet_ntoa () 기능은 IP 주소를 숫자 값에서 반환하고 그 반대를 반환합니다. " 위에서 언급 한 PHP 기능을 사용하기로 결정하지 않는 한 이것이 DB에서 함께 갈 것 같아요.

가장 좋은 방법 (IPS의 정렬 및 기타 제어가 필요하지 않은 경우)은 다음과 같습니다. int로 저장하십시오, Varchar 등으로 저장하는 것은 단순한 무고한 int보다 더 많은 성능이 비용이 듭니다.

재산이 있습니다 IPAddress.Address 그러나 IP 클래스를 정렬하거나 제어 할 필요가 없다면 가장 좋은 방법은 서명되지 않은 정수 (최대 값이있는 최대 값이있는 가장 좋은 방법은 0xffffffff 어느 것과 동일합니다 255.255.255.255 소수점 표현으로.

또한 iPaddress 클래스에는 긴 인수를 받아들이는 생성자가 있습니다.

그리고 vs 디버거 시각화에 따르면, iPaddress 클래스 자체는 내부 변수를 하나의 숫자 (바이트 어레이가 아님)로 저장합니다.

MS SQL Server에 장치를 저장하는 해결 방법에 대한 자세한 내용 :

공간 효율적인 스토리지 및 값을 처리 할 때 (범위와 일치하거나) int. IP 주소는 실제로 32 비트 값입니다.

값을 보려고하는 간단한 솔루션을 위해서는 varchar(15) IP 주소의 문자열 표현을 저장합니다.

나는 4 개의 smallint (또는 당신이 선호하는 작은 정수 데이터 유형) 열 - 각각 1 옥트마다 하나를 만들어 성공했습니다. 그런 다음 숯 문자열 (디스플레이 용)으로 함께 부수는 모습을 볼 수 있거나 간단한 연산자를 작성하여 서브넷 등에 모든 사람이 누구인지 판단 할 수 있습니다.

매우 빠르며 (적절한 인덱싱을하는 경우) 쿼리를 쉽게 할 수 있습니다 (문자열 조작 없음!).

IP 주소에 32 비트가 있으므로 숫자 값을 저장하기 위해 오랫동안 사용할 수 있습니까?
Varchar를 사용하는 것만 큼 공간 웅장한 것은 아니지만, 매번 사용하기 전에 IP로 다시 해독해야하며 비용과 오버 헤드는 그만한 가치가 없습니다.

MSSQL 데이터베이스에 IPv4 주소를 저장하는 데 가장 적합한 데이터 유형은 int. 유일한 비트는 디스플레이/정렬을 위해 점선 표기법으로 다시 변환하는 것입니다. 따라서이를 자동화하는 뷰를 만드는 것이 좋습니다.

나는 아마 a와 함께 갈 것입니다 varchar 또는 char.

크기를 15로 설정합니다.

인용 이것:

IP 주소를 Char (15) 열에 저장하십시오. 저장하고있는 데이터의 양에 따라, 이것은 상당히 낭비 될 수 있습니다 (왜 도트를 저장해야합니까?). 나

저는 초보자 @ php, sql이지만 SQL DB에 무언가를 저장하는 가장 빠른 방법은 int 값으로 변환하고 int로 저장하는 것입니다.

PHP에서 기능을 사용했습니다.

function ip_convert() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $intip = str_replace(".","0",$ip);
    return $intip;
}

그런 다음 모든 점을 0으로 교체합니다. 그런 다음 SQL 에서이 IP를 사용해야한다면 .. if ($ IP == IP_CONVERT ())

그러나 이것은 PHP를 사용하는 경우에만.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top