sourcecode

IPv6 호환 주소를 관계형 데이터베이스에 저장하는 방법

codebag 2023. 9. 25. 22:37
반응형

IPv6 호환 주소를 관계형 데이터베이스에 저장하는 방법

그걸 어떻게 하는 거죠?

지금 당장은 IPv6를 사용하지 않지만, IPv6를 사용할 수 있도록 애플리케이션을 설계해야 합니다.IP 주소와 CIDR 블록(BGP NLRI도 있지만 이것은 다른 이야기입니다)을 MySQL 데이터베이스에 저장해야 합니다.저는 항상 IPv4용 INT + 마스크렌용 TINYINT를 사용했는데 IPv6는 128비트입니다.

그것을 위해 어떤 접근법이 가장 좋을까요?2xBIGINT?CHAR(16)바이너리 스토리지의 경우?CHAR(39)텍스트 저장용?8xSMALLINT전용 테이블에?

무엇을 추천하시겠습니까?

아직 IPv6 주소 형식을 기본적으로 지원하지 않는 MySQL에 대해 어떤 것이 정답인지 잘 모르겠습니다(그러나 "WL#798: MySQL IPv6 지원"을 통해 MySQL v6.0에 포함되었음을 알 수 있습니다. 현재 문서에서는 이를 지원하지 않습니다.

하지만 당신이 제안한 것들 중에서 저는 2 * BIGINT로 가보는 것을 제안하지만, 서명되지 않은 것을 확실히 해야 합니다.IPv6의 /64 주소 경계에는 (/64가 가장 작은 넷블록 크기이기 때문에) 이와 잘 일치하는 일종의 자연스러운 분할이 있습니다.

범위 식별자를 포함한 IPv6 주소의 최대 길이는 표준 C 헤더에서 INET6_ADDRSTLEN에 의해 정의된 대로 46바이트입니다.인터넷 사용의 경우 영역 식별자(%10, #eth0 등)를 무시할 수 있지만 getaddrinfo가 예상보다 긴 결과를 반환할 때에만 주의해야 합니다.

만약 당신이 char(16) 쪽으로 기울고 있다면, 그 대신에 binary(16)를 반드시 사용하세요. binary(n)는 모음이나 문자 집합의 개념이 없습니다(또는 오히려 'binary'의 char(n)입니다).charin mysql의 기본값은 latin1_swedish_ci입니다. 즉, latin1의 유효한 코드 포인트인 바이트 값에 대해 대소문자 구분 없이 정렬 및 비교를 시도하므로 예기치 않은 모든 문제가 발생합니다.

다른 옵션은 decimal (39, 0) zero fill unsigned를 사용하는 것으로, bigint 2개만큼 효율적이지는 않지만(decimal은 현재 버전의 mysql에서 9자리당 4바이트를 사용함), 한 열에 모두 보관하고 잘 인쇄할 수 있습니다.

저는 전체 39자 "표준" 인쇄 형식을 선택합니다.

"2001:0db8:85a3:0000:0000:8a2e:0370:7334"

널 터미네이터가 있는 40.

*nix 명령줄 도구에서 사용하는 형식이며, IPV6 주소는 일반(?) 형식으로 보고됩니다.

IP 주소는 바이너리가 의미가 있는 프로그램에서 사용할 것입니까?아니면 텍스트 표현을 저장하는 것이 좋겠습니까?또한 IPv6을 사용하면 일반적으로 주소를 사용할 가능성이 낮고 호스트 이름을 사용할 가능성이 높습니다.관련성이 있는지 여부는 애플리케이션에 따라 다릅니다.CHAR(16)은 나쁜 선택이 될 것입니다. CHAR는 문자 데이터를 위한 것이며 IPv6 주소에 널리 사용되는 0바이트의 빅 스트림을 좋아하지 않을 것입니다. 2 x BIGINT는 불편할 것입니다. 실제로 하나의 필드 두 개(게다가 저장된 값은 빅 엔디언입니까? 아니면 리틀 엔디언입니까?).고정된 크기의 이진법을 사용하거나, 사용할 수 없는 경우 블롭 타입을 사용했습니다.

저는 가장 긴 접두사 매칭 프로젝트를 진행하고 있어서 IPv4 주소의 경우 주소를 4개 정수로 분리합니다.효과가 좋습니다.IPv6 주소로 확장하겠습니다.

언급URL : https://stackoverflow.com/questions/420680/how-to-store-ipv6-compatible-address-in-a-relational-database

반응형

'sourcecode' 카테고리의 다른 글

자바스크립트 날짜 + 7일  (0) 2023.09.25
Apache-POI 행 정렬(Excel)  (0) 2023.09.25
mariadb에서 상태 쿼리 오류 표시  (0) 2023.09.25
각 2에서 $임의치는 무엇입니까?  (0) 2023.09.25
Swift에서 CGFloat 반올림  (0) 2023.09.25