source

MySQL에서의 IPv6 주소 저장

gigabyte 2023. 1. 2. 22:38
반응형

MySQL에서의 IPv6 주소 저장

ipv6 대응 inet_aton inet_ntoa 함수 필요」에서 요구되고 있는 것처럼, IPv6 주소를 격납하기 위한 MySQL 함수는 현재 없습니다.저장/삽입에 권장되는 데이터 유형/함수는 무엇입니까? (문자열로 저장할 생각은 없습니다.)또, IPv6 주소를 2개의 INT로 분할하고 싶지 않습니다.

그럼 어떻게 해?

BINARY(16)

그 정도면 충분히 효과적일 겁니다.

현재 MySQL 서버에서 텍스트 IPv6 주소를 바이너리로 변환하는 기능은 없습니다(이 버그리포트에 기재되어 있습니다).이를 수행하려면 응용 프로그램에서 수행하거나 MySQL 서버에서 UDF(사용자 정의 함수)를 만들어야 합니다.

갱신:

MySQL 5.6.3은 IPv6 주소를 지원합니다. "INET6_ATON(expr)"을 참조하십시오.

데이터 타입은VARBINARY(16)대신BINARY(16)아까도 말씀드렸듯이유일한 이유는 MySQL 함수가 IPv6 주소와 IPv4 주소 모두에서 작동하기 때문입니다. BINARY(16)는, IPv6 주소만을 보존해, 1 바이트를 절약할 수 있습니다. VARBINARY(16)는, IPv6 주소와 IPv4 주소의 양쪽 모두를 처리할 때에 사용할 필요가 있습니다.

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

아직 제대로 된 답변을 게시한 사람은 없습니다(또한 많은 예에서 Windows를 사용하고 있습니다.::1라이브 환경(또는 실가동 환경)에 대해 오해를 불러일으킬 수 있습니다(적어도 제가 찾을 수 있는 것).다음은 예를 제시하겠습니다.

  1. 저장할 형식입니다.
  2. INSERT상당히 복잡한 IPv6 IP 주소를 사용하여 쿼리합니다.
  3. SELECT할 수 있는 질문echoIPv6 IP 주소를 클라이언트에 되돌립니다.
  4. 레거시 코드를 빠뜨리지 않았는지 확인하기 위한 트러블 슈팅.

모든 컬럼 이름을 로 변경했습니다.ipv6IPv6 를 적절히 서포트하고 있는 것을 반영합니다(이것에 의해, 낡은 열을 유지할 수 있습니다).ip온전).저장 가능ip의 컬럼ipv6컬럼과 그 다음에DROPipcolumn 변환이 제대로 된 것이 확인되면, 실제로 시간이 나면 이 포스트에 추가하겠습니다.

IPv6 데이터 타입

전술한 바와 같이VARBINARY 16AMD가 128비트 CPU를 탑재하여 데이터베이스가 128비트 정수를 지원하도록 업데이트될 때까지 이 방법을 사용하는 것이 바람직합니다(제 말이 맞나요?).IPv6 는, 64 비트가 아니고 128 비트입니다.

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 쿼리

IP 주소를 , IPv6 를 보존할 .SELECT다음은 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 아니요,, IPv6; IPv6;)가 아닙니다.FE80:0000:0000:0000:0202:B3FF:FE1E:8329요약판/속기판입니다.정식 정식 풀렝스 버전으로 하는 코드가 있지만, 이 Q/A가 계속 올라오고 있기 때문에 저와 다른 사람들의 시간을 절약하기 위해서입니다.

중요: 일부 IPv6 주소가 다음 환경에 적합하다고 생각되기 때문에bigint2분 후에, 보다 큰 IPv6 주소를 가지는 사람이 들르지 않고, 대혼란을 일으키지 않는 것은 아닙니다.

이것이 또 다른 20개의 탭을 여는 광기어린 사람들을 구할 수 있기를 바란다.나중에 시간이 나면 압축된 IPv6를 완전한 포맷으로 확장하는 추가 PHP 코드를 추가하겠습니다.


트러블 슈팅

IPv6 주소의 보존이나 취득이 어떠한 이유로 기능하지 않는 경우는, 「상세 검색과 교환」의 카피를 입수해 주세요(Linux 네이티브보다 Wine에서 동작하는 속도가 빠릅니다).grep교환이 아니라 주로 검색용으로 사용합니다.소프트웨어의 모든 부분에서 코드가 일치하는지 확인합니다.

  • ★★★★★$ip변수를 변환해야 합니다.$ipv6그 정도는 잘 처리해놨다는 거 알잖아요
  • 끝부분을 .) 4단계는 4단계입니다.
  • 모든 PHP 인스턴스 검색 inet_pton(이치노
  • 모든 PHP 인스턴스 검색 inet_ntop(이치노
  • SQL의 모든 인스턴스 검색 INET_ATON(이치노
  • SQL의 모든 인스턴스 검색 INET_NTOA(이치노
  • 의 모든 합니다.$ipv6가 IP-IN-TO-SQL을 사용하고 있는지 합니다.INET6_ATON('$ipv6')이 IP-FROM-SQL을 사용하는 INET6_NTOA(ipv6) AS ipv6.
  • 의 모든 합니다.$row1['ip']로 대체한다.$row1['ipv6'].
  • $ipv6 =가 변경된 합니다. (데이터베이스 오브젝트 참조가 변경된 경우). $ipv6 = (isset($_SERVER['REMOTE_ADDR']) && strlen($_SERVER['REMOTE_ADDR']) > 0) ? mysqli_real_escape_string($db,$_SERVER['REMOTE_ADDR']) : mysqli_real_escape_string($db,getenv('REMOTE_ADDR'));.
  • 디버깅을 시작하기 전에 문제가 있음을 알고 있는 경우 테스트에서 조작될 가능성이 있는 버전이 아닌 새로 테스트된 IP 주소를 사용하도록 하십시오.

좋은 예지만 나는 다음 점에 주목했다.은 자신의이 있는 하다.mysql을 위한 기능으로서 가지고 있다.INET6_ATON그렇지 않으면 다음과 같은 오류 메시지가 표시될 수 있습니다. ★★★FUNCTION DOES NOT EXIST.

언급URL : https://stackoverflow.com/questions/6964143/storing-ipv6-addresses-in-mysql

반응형