복붙노트

[SQL] MySQL의에서 보관 IPv6 주소

SQL

MySQL의에서 보관 IPv6 주소

마찬가지로 "필요할 IPv6 지원 INET_ATON 및 inet_ntoa 함수"에 요청 된 현재의 IPv6 주소를 저장하기위한 MySQL의 기능이 없다. 무엇 / 저장 삽입하기위한 권장되는 데이터 유형 / 기능 것입니까? (I 문자열로 저장하려고하지 않습니다). 또한 2 INT의에 IPv6 주소를 분리하고 싶지 않아요.

해결법

  1. ==============================

    1.방법에 대해 :

    방법에 대해 :

    BINARY(16)
    

    즉 충분히 효과적이어야한다.

    현재이 버그 리포트에서 언급 한 바와 같이, MySQL 서버에서 바이너리로 /에서 텍스트 IPv6 주소를 변환하는 기능은 없습니다. 당신은 응용 프로그램에서 그것을 할 또는 아마도 그렇게 MySQL 서버에서 UDF (사용자 정의 함수)를 만드는 중 하나가 필요합니다.

    최신 정보:

    "INET6_ATON (EXPR)": MySQL의 5.6.3는 다음을 참조 IPv6 주소에 대한 지원을하고있다.

    앞서 제안 데이터 유형은 VARBINARY (16) 대신 BINARY (16)이다. 이것에 대한 유일한 이유는 MySQL의 기능을 모두 IPv6 및 IPv4의 주소를 일 것입니다. BINARY (16) 만 IPv6 주소를 저장하며 미세 한 바이트를 저장한다. 양쪽의 IPv4 주소를 IPv6 및 취급시 VARBINARY (16)가 사용되어야한다.

    "IPV6 기능이 MYSQL 5 확장": MySQL과 MariaDB의 이전 버전에 대한 구현은 다음을 참조하십시오.

  2. ==============================

    2.아무도 전체 작업 대답을 게시하지 않았다 (과 예제를 많이 사용하는 윈도우 : 1 매우 라이브 (또는 "생산"에 대한 오해의 소지가 될 수있다) 환경) 언제 어디 그래서 여기에 (내가 찾을 수 이상) :

    아무도 전체 작업 대답을 게시하지 않았다 (과 예제를 많이 사용하는 윈도우 : 1 매우 라이브 (또는 "생산"에 대한 오해의 소지가 될 수있다) 환경) 언제 어디 그래서 여기에 (내가 찾을 수 이상) :

    나는 그들이 제대로 IPv6를 지원 반영하기 위해 IPv6로 모든 열 이름을 변경 (그리고 당신이 그대로 IP 이전 열을 유지할 수 있습니다). 이는 IPv6의 열에서 IP 열을 저장하고 당신이 변환이 근무하고있다 특정있어 일단 다음 단지의 IP 열을 삭제 할 수 있습니다; 실제로 시간이있을 때 나는이 게시물에 그것을 추가 할 것입니다.

    IPv6의 데이터 유형

    로 VARBINARY (16)는 AMD 128 개 비트 CPU가 우리를 축복하고 데이터베이스가 128 개 비트 정수를 지원하도록 업데이트 될 때까지 갈 수있는 바람직한 방법이 언급되어있다 (나는 제대로 말 했는가?). IPv6은 128 비트가 아니라 64 비트이다.

    CREATE TABLE `example`
    (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `ipv6` VARBINARY(16) NOT NULL,
    PRIMARY KEY (`id`)
    )
    COLLATE='utf8mb4_unicode_520_ci'
    ENGINE=InnoDB;
    

    IPv6의 INSERT 쿼리

    우리는 분명히 우리가 그것을 선택하기 전에의 IPv6 IP 주소를 저장해야합니다; 여기에 PHP / SQL 코드는 다음과 같습니다

    $ipv6 = mysqli_real_escape_string($db,'FE80:0000:0000:0000:0202:B3FF:FE1E:8329');
    $query1 = "INSERT INTO example (ipv6) VALUES (INET6_ATON('$ipv6'));";
    

    IPv6의 SELECT 쿼리

    PHP는 / SQL 코드 :

    $ipv6 = mysqli_real_escape_string($db,'FE80:0000:0000:0000:0202:B3FF:FE1E:8329');
    $query2 = "SELECT INET6_NTOA(ipv6) AS ipv6 FROM example WHERE ipv6=INET6_ATON('$ipv6');";
    

    이 FE80 돌아갑니다 :: 202 : b3ff : fe1e : 8329을; 아니, (FE80입니다 : 0000 : 0000 : 0000 : 0202 : B3FF : FE1E : 8329)가 아닌 전체 IPv6은, 그것은 응축 / 속기 버전입니다. 거기 공식적인 전체 길이 버전 만드는 코드는하지만이 Q / A가 올라오고 계속 사람이기 때문에 자신과 다른 사람의 시간을 절약하는 것입니다.

    중요 : 의해와 과시의 혼란 멈추지 않을 것입니다 더 큰 IPv6 주소 두 분 후에 사람을 의미하는 것은 아니다 BIGINT에 맞는 것처럼 일부 IPv6 주소 모양해서.

    희망이 다른여 개의 탭을 여는 광기에서 몇몇 사람을 저장합니다. 나는 미래에 시간이 언제 전체 공식적인 형식으로 압축 된 IPv6를 확장 여분의 PHP 코드를 추가합니다.

    문제 해결

    어떤 이유로 저장 및 / 또는 IPv6 주소를 검색하는 경우 (리눅스의 기본 그렙보다 와인에 빠르게 작동) 찾기 및 바꾸기 당신을 위해 일하고 자신에게 고급의 사본을 잡아되지 않고, 발견하지 교체를 위해 주로 사용합니다. 코드가 소프트웨어의 모든 곳에서 일관성이 있음을 확인합니다.

  3. ==============================

    3.우수한 예 그러나 나는 다음을 지적했다. MySQL은 하나의 버전 INET6_ATON에 대한 함수로있는 경우 그에만 작동합니다. 그 함수가 존재하지 않는 그렇지 않으면, 오류 메시지가 뭔가를 할 수 있습니다.

    우수한 예 그러나 나는 다음을 지적했다. MySQL은 하나의 버전 INET6_ATON에 대한 함수로있는 경우 그에만 작동합니다. 그 함수가 존재하지 않는 그렇지 않으면, 오류 메시지가 뭔가를 할 수 있습니다.

  4. from https://stackoverflow.com/questions/6964143/storing-ipv6-addresses-in-mysql by cc-by-sa and MIT license