2009-09-06 2 views
4

가능한 가장 컴팩트 한 방법으로 IP 주소를 저장해야하므로 검색이 중요하지 않습니다. 이것은 또한 모든 DB (MySQL, SQLite, Postgres 등)를 사용하여 Windows, Linux 및 Mac에서 호환 가능해야합니다.IP 주소 (v4 또는 v6)를 PHP를 사용하여 데이터베이스에 int로 저장하는 방법은 무엇입니까?

PHP의 ip2long() 및 long2ip() 함수 덕분에 IPX 주소를 varchar (15) 등이 아닌 작은 int 필드로 변환 할 수 있습니다. 문제는 우리가 IP6로 전환하는 단계에 있다는 것입니다. IP6에서 작동하지 않는 기능을 포함하여 대부분의 기존 모범 사례가 실패하고 있음을 의미합니다. 또한 INET_ATON() 및 INET_NTOA()와 같은 DB 특정 함수는 여기에 옵션이 없습니다.

그렇다면 시스템에서 작동하는 방식으로 IP 주소를 INT (또는 다른 모든 소형 형식)로 어떻게 저장합니까?

편집

: Wrang-wrang는 지적 The thread 팩 및 IP4 또는 IP6 중 하나를 풀고 inet_ntop()와 inet_ptop()의 사용을 언급하고있다. 문제는 PHP/5.1에서 Linux/Mac에서만 작동하며 (문제가 아닌) +5.3의 Windows에서 작동한다는 것입니다.

각 데이터베이스에서 권장 한 varbinary (16) 필드의 대체 항목이 문제가 아닌 경우?

+0

[이 SO 스레드] (http://stackoverflow.com/questions/420680/how-to-store-ipv6-compatible-address-in-a-relational-database)를보고 싶을 수도 있습니다. 포스터는 IPv6 주소를 저장하기 위해 두 개의'BIGINT' 필드를 사용하여 정착되었지만 고려해야 할 다른 제안이 있습니다. – zombat

답변

4

당신은 128 비트를 저장하는 방법을 선택해야합니다

::/96 -이 원래 IPv4 호환 주소로 알려진 96 비트 제로 값 접두사입니다. 이 클래스 주소는 IPv6 전환 기술 내에서 IPv4 주소를 나타내는 데 사용되었습니다. 이러한 IPv6 주소는 첫 번째 96 비트가 으로 설정되고 마지막 32 비트는 IPv4 주소로 표시됩니다. IETF (Internet Engineering Task Force)는 가 출판 RFC와 IPv4 호환 주소의 사용되지 않는 한이 주소 형식 의 4291. 유일한 나머지 사용은 고정과 테이블이나 데이터베이스에 IPv4 주소를 표현하는 것입니다 크기가 인 구성원은 도 IPv6 주소를 저장할 수 있어야합니다.

(http://en.wikipedia.org/wiki/IPv6에서)

나는 두 BIGINT UNSIGNED 그들을 저장하는 합리적인 방법이 될 것이라고 생각하지만, 난 당신이 진 (바이트 배열)을 사용할 수있는 것 같아요.

이 질문은 당신이 사용할 수있는 Working with IPv6 Addresses in PHPHow to store IPv6-compatible address in a relational database

0

이미 응답 한 것으로 나타납니다이 universal php library : 그 ip2longlong2ip 방법은 IPv4와 IPv6 모두와 함께 작동합니다.

+1

[개인 오픈 소스 라이브러리 제공 방법] (https://meta.stackexchange.com/q/229085)을 읽어보십시오. –

관련 문제