[SQL] MySQL의에서 보관 IPv6 주소
SQLMySQL의에서 보관 IPv6 주소
마찬가지로 "필요할 IPv6 지원 INET_ATON 및 inet_ntoa 함수"에 요청 된 현재의 IPv6 주소를 저장하기위한 MySQL의 기능이 없다. 무엇 / 저장 삽입하기위한 권장되는 데이터 유형 / 기능 것입니까? (I 문자열로 저장하려고하지 않습니다). 또한 2 INT의에 IPv6 주소를 분리하고 싶지 않아요.
해결법
-
==============================
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.아무도 전체 작업 대답을 게시하지 않았다 (과 예제를 많이 사용하는 윈도우 : 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.우수한 예 그러나 나는 다음을 지적했다. MySQL은 하나의 버전 INET6_ATON에 대한 함수로있는 경우 그에만 작동합니다. 그 함수가 존재하지 않는 그렇지 않으면, 오류 메시지가 뭔가를 할 수 있습니다.
우수한 예 그러나 나는 다음을 지적했다. MySQL은 하나의 버전 INET6_ATON에 대한 함수로있는 경우 그에만 작동합니다. 그 함수가 존재하지 않는 그렇지 않으면, 오류 메시지가 뭔가를 할 수 있습니다.
from https://stackoverflow.com/questions/6964143/storing-ipv6-addresses-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 조인에서 여러 행에 조건을 적용하기위한 SQL (0) | 2020.05.08 |
---|---|
[SQL] 싱글 부모 엔터티와 코어 데이터 성능 (0) | 2020.05.08 |
[SQL] SQL 쿼리는 지정된 키의 각 인스턴스에 대해 가장 최근의 행을 얻을 수 있습니다 (0) | 2020.05.08 |
[SQL] A는 포함하거나 테이블 또는 인덱싱 된 뷰에 FREETEXT 조건이 전체 텍스트하지 않기 때문에 사용할 수 없습니다 인덱스 (0) | 2020.05.08 |
[SQL] 무슨 오류를 일으키는 : 참조 된 테이블에 대한 키를 제공에는 고유 제한 조건의 일치가 없다? (0) | 2020.05.08 |