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

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

  •  05-07-2019
  •  | 
  •  

문제

어떻게해야하나요?

현재 IPv6은 사용되지 않지만 IPv6- 준비를 위해 응용 프로그램을 설계해야합니다. MySQL 데이터베이스에 IP 주소와 CIDR 블록 (BGP NLRI, 또 다른 스토리)을 저장해야합니다. 나는 IPv4 + int를 Masklen의 Tinyint에 사용했지만 IPv6은 128 비트입니다.

그것에 가장 적합한 접근법은 무엇입니까? 2xBIGINT? CHAR(16) 이진 저장 용? CHAR(39) 텍스트 저장 용? 8xSMALLINT 전용 테이블에서?

어떤 것을 권 하시죠?

도움이 되었습니까?

해결책

나는 어느 것이 있는지 잘 모르겠습니다 오른쪽 MySQL에 대한 답변은 아직 IPv6 주소 형식을 기본적으로 지원하지 않는다는 점에서 "WL#798 : MySQL IPv6 지원"MySQL v6.0에있을 것이라고 제안합니다. 현재 문서는이를 뒷받침하지 않습니다).

그러나 당신이 제안한 사람들 중 2 * bigint를 제안하지만 서명되지 않은지 확인하십시오. IPv6의 /64 주소 경계에는 일종의 자연 스플릿이 있습니다 (A /64가 가장 작은 넷 블록 크기이기 때문에).

다른 팁

스코프 식별자를 포함한 IPv6 주소의 최대 길이는 표준 C 헤더에서 inet6_addrstrlen에 의해 정의 된 46 바이트입니다. 인터넷 사용을 위해서는 영역 식별자 (%10, #eth0 등) 그러나 언제 그냥 알고 있어야합니다. getAddrinfo 예상보다 더 긴 결과를 반환합니다.

문자 (16)에 기대어 있다면 대신 이진 (16)을 사용하십시오. 바이너리 (n)에는 콜라이트 또는 캐릭터 세트 개념이 없습니다 (또는 오히려 '바이너리'의 숯/콜라이트가있는 숯 (n)입니다. MySQL의 Char의 기본값은 Latin1_Swedish_CI입니다. 즉, LATIN1의 유효한 코드 포인트 인 BYTE 값에 대한 사례 감수성 정렬 및 비교를 시도하므로 모든 예상치 못한 문제를 유발할 수 있습니다.

또 다른 옵션은 Decimal (39, 0) Zerofill을 사용하는 것입니다. 두 개의 bigint만큼 효율적이지는 않지만 (Decimal은 MySQL의 현재 버전에서 9 자리당 4 바이트를 사용합니다) 하나의 열에 보관하고 인쇄 할 수 있습니다. 멋지게.

나는 전체 39 문자 "표준"인쇄 형식으로 갈 것입니다 :-

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

널 터미네이터가있는 40.

이것은 *nix 명령 줄 도구에서 사용하는 형식이며, IPv6 주소 형식은 Normaly (?)에보고되었습니다.

바이너리가 의미가있는 프로그램에서 IP 주소가 사용 되는가? 아니면 텍스트 표현을 저장하는 것이 더 좋을까요? 또한 IPv6의 경우 일반적으로 주소를 사용할 가능성이 적고 호스트 이름을 사용할 가능성이 높습니다. 관련이 있는지 여부는 부분적으로 응용 프로그램에 따라 다릅니다. 숯 (16)은 나쁜 선택 일 것이다. Char는 문자 데이터를위한 것이며 IPv6 주소에서 널리 퍼져있는 제로 제로 바이트 스트림을 좋아하지 않습니다. 2 x bigint는 불편할 것입니다-실제로 하나의 필드 (플러스 값은 Big-Endian 또는 Little-Endian)입니다. 고정 된 크기 이진 유형을 사용했거나 사용할 수없는 경우 Blob 유형을 사용했습니다.

가장 긴 접두사 일치 프로젝트를 사용하고 있으므로 주소를 IPv4 주소의 4 개의 정수로 분리합니다. 잘 작동한다. IPv6 주소로 확장했습니다.

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