SQL 서버에 IP 주소를 저장하는 데 가장 적합한 데이터 유형은 무엇입니까?
SQL 서버에 IPv4 주소를 저장하는 데 가장 권장되는 데이터 유형은 무엇입니까?
또는 누군가 이미 사용자 SQL 데이터 유형(.그것을 위한 네트 어셈블리)?
분류할 필요 없어요.
IPv4 주소를 (4)로 저장하는 것은 해당 주소가 나타내는 것에 가장 적합하며, 서브넷 마스크 스타일 쿼리를 쉽게 수행할 수 있습니다.그러나 실제로 텍스트 표현을 사용하는 경우에는 변환이 필요합니다.이 경우 문자열 형식을 선호할 수 있습니다.
문자열로 저장하는 경우 도움이 될 수 있는 거의 사용되지 않는 SQL Server 기능은 참고로 입니다.IP 주소용으로 설계되지 않았지만 IP 주소에 완벽하게 적합합니다.아래 통화에서 '14'가 반환됩니다.
SELECT PARSENAME('123.234.23.14', 1)
(오른쪽에서 왼쪽).
저는 보통 IPv4 주소에 대해 varchar(15)를 사용하지만, 0을 패드하지 않는 한 정렬하는 것은 어렵습니다.
과거에 INT로 저장한 적도 있습니다.System.Net.IPAddress
에는 IP 주소를 나타내는 4바이트 배열로 반환하는 메서드가 있습니다.다음 C# 코드를 사용하여 을 (으)로 변환할 수 있습니다.int
...
var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
중복 주소를 많이 검색해야 하기 때문에 사용했으며 인덱스가 가능한 한 작고 빠르게 생성되기를 원했습니다.그런 다음 주소를 int에서 .net의 개체로 다시 가져오려면 의 메소드를 사용하여 int를 바이트 배열로 가져옵니다.해당 바이트 배열을 생성자에게 전달하여 바이트 배열을 사용하면 시작한 것으로 백업됩니다.
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
공간 효율적인 스토리지를 위해 값을 처리해야 할 때(일치하거나 범위와 비교할 때),int
IP 주소는 32비트 값에 불과합니다.
보기 위한 값을 저장하려는 간단한 솔루션의 경우 다음을 사용합니다.varchar(15)
IP 주소의 문자열 표현을 저장합니다.
IPv6에 대해서는 잊지 마세요 - 저장할 필요가 있다면 더 많은 공간이 필요합니다 - 128비트는 IPv4의 32비트와 비교됩니다.
저는 bigint를 원하지만, 인간 친화적인 버전으로 번역하려면 도우미 코드가 필요합니다.
제가 가장 좋아하는 기사 중 하나는 IP 주소를 구문 분석하기 위해 정규식을 사용하면 안 되는 이유에 대해 이야기합니다.그들이 말하는 대부분은 왜 IP 주소의 텍스트 표현에 매우 주의해야 하는지를 설명하는 것입니다.데이터베이스에서 사용할 데이터 유형을 결정하기 전에 이 문서를 읽는 것이 좋습니다. 그리고 아마도 앱이 어떤 작업을 수행할지 결정하기 전에 이 문서를 읽는 것이 좋습니다(비록 Perl에 대한 기사가 작성되어 있지만 모든 언어에 유용합니다).
결국 32비트 데이터 유형(또는 4개의 8비트 데이터 유형)이 가장 좋은 선택이라고 생각합니다.
저는 여기서 비슷한 질문을 많이 읽고 있는데, 이 질문의 답변 중 다른 답변에서 1위를 차지하는 답변은 없습니다. "IPv4 주소의 경우 서명되지 않은 주소로 저장하고 INET_ATON() 및 INET_NTOA() 함수를 사용하여 숫자 값에서 IP 주소를 반환하고 그 반대의 경우도 마찬가지입니다."위에서 언급한 php 함수를 사용하기로 결정하지 않는 한, 이것이 제 DB에 들어갈 것이라고 생각합니다.
IPV4? int? 또는 tinyint x 4?
이는 단순히 저장 및 검색을 위한 것인지 아니면 광범위한 검색 기준을 충족할 것인지에 따라 결정됩니다.
그것은 당신의 목적에 달려 있습니다.최고의 스토리지와 성능을 원하는 경우 대부분의 경우 int로 저장하고 varchar 등으로 저장하는 것이 단순하고 순수한 int보다 성능이 더 많이 소요됩니다.
또한 검색 매개변수를 원하는 int로 하여 IP로 검색할 수 있습니다.
속성이 있지만 더 이상 사용되지 않습니다. IP 클래스를 정렬하거나 제어할 필요가 없는 경우 가장 좋은 방법은 서명되지 않은 정수(최대 값:0xffffffff
은 에해하것는과 .255.255.255.255
십진법으로
를 사용하면 으로 EF Core로 하거나 EF Core에서 변환할 수 .IPAddress
.
또한 IPAddress 클래스에는 긴 인수를 허용하는 생성자가 있습니다.
VS 디버거 비주얼라이저에 따르면 IPAddress 클래스 자체는 내부 변수를 바이트 배열이 아닌 하나의 숫자로 저장합니다.
MS SQL Server에 장치를 저장하는 방법에 대한 자세한 내용:
저는 4개의 작은 int(또는 원하는 작은 정수 데이터 유형) 열을 만드는 데 성공했습니다. 각 옥텟마다 하나씩 말입니다.그런 다음 보기를 만들어 함께 문자 문자열로 표시하거나 간단한 연산자를 작성하여 모든 사용자가 어떤 서브넷에 있는지 등을 확인할 수 있습니다.
(적절한 인덱싱을 수행할 경우) 매우 빠르고, 매우 쉽게 쿼리할 수 있습니다(문자열 조작 없음!).
IP 주소에 32비트가 포함되어 있기 때문에 LONG을 사용하여 수치를 저장할 수 있습니까?
VARCHAR를 사용하는 것만큼 공간을 낭비하지는 않지만, 사용하기 전에 IP로 다시 디코딩해야 합니다. 따라서 지연 시간과 오버헤드는 가치가 없습니다.
인용:
IP 주소를 CHAR(15) 열에 저장합니다.저장하는 데이터의 양에 따라 상당히 낭비적일 수 있습니다(점을 저장해야 하는 이유는 무엇입니까?).i
저는 초보 @ 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_html)
하지만 이것은 당신이 PHP를 사용하는 경우에만 가능합니다.
언급URL : https://stackoverflow.com/questions/1038950/what-is-the-most-appropriate-data-type-for-storing-an-ip-address-in-sql-server
'programing' 카테고리의 다른 글
단일 SQL 연결에서 여러 SQL 명령을 실행하는 방법은 무엇입니까? (0) | 2023.07.10 |
---|---|
ggplot2 플롯 영역 여백? (0) | 2023.07.10 |
SQL Server 저장 프로시저/함수에서 입력-출력 매개 변수를 선언하는 방법 (0) | 2023.07.10 |
SQL Server Management Studio에서 로컬 데이터베이스에 연결하는 방법은 무엇입니까? (0) | 2023.07.10 |
MongoDB와 함께 PouchDB 사용 (0) | 2023.07.10 |