要存储的格式。
使用相当复杂的IPv6 IP地址查询示例INSERT。
示例SELECT查询您将能够echo将IPv6 IP地址返回给客户端。
排除故障以确保您没有错过任何遗留代码。
醇>
我将所有列名更改为ipv6,以反映他们正确支持IPv6(这样可以保持旧列ip完好无损)。可以在ip列中存储ipv6列,然后在您确定转换有效后再点击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查询
我们显然需要在SELECT之前存储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;不,不是完整的IPv6(FE80:0000:0000:0000:0202:B3FF:FE1E:8329),它是一个浓缩/速记版本。有代码使它成为正式的完整版本,但这是为了节省自己和其他人的时间,因为这个 Q / A是一个不断出现的。
重要提示,只是因为某些 IPv6地址看起来就像他们适合bigint一样不是意味着两分钟之后,拥有更大IPv6地址的人不会停下来并造成严重破坏。
希望这可以使一些人免于打开另外两打标签的疯狂。当我将来有时间时,我会添加额外的PHP代码,将浓缩的IPv6扩展为完整的正式格式。
疑难解答强>
如果出于某种原因存储和/或检索IPv6地址对您不起作用,那么请自己获取Advanced Find and Replace的副本(在Wine中比在本地grep中更快地运行;);使用此主要来查找,而不是替换。确保您的软件中的代码一致。