当前位置:  开发笔记 > 编程语言 > 正文

在MySQL中存储IPv6地址

如何解决《在MySQL中存储IPv6地址》经验,为你挑选了2个好方法。

正如在"需要ipv6的inet_aton和inet_ntoa函数 "中所要求的那样,目前没有用于存储IPv6地址的MySQL函数.什么是用于存储/插入的推荐数据类型/功能?(我不打算将它们存储为字符串).我也不想将IPv6地址分成2个INT.



1> snap..:

怎么样:

BINARY(16)

这应该足够有效.

目前,没有在MySQL服务器中将文本IPv6地址从/转换为二进制文件的功能,如错误报告中所述.您需要在应用程序中执行此操作,或者可能在MySQL服务器中创建UDF(用户定义函数)来执行此操作.

更新:

MySQL 5.6.3支持IPv6地址,请参阅以下内容:" INET6_ATON(expr) ".

数据类型VARBINARY(16)不是BINARY(16)我之前建议的.唯一的原因是MySQL功能适用于IPv6和IPv4地址.BINARY(16)适用于仅存储IPv6地址并保存一个字节.VARBINARY(16)处理IPv6和IPv4地址时应使用.

旧版MySQL和MariaDB的实现,请参阅以下内容:" 使用IPV6函数扩展MYSQL 5 ".


感谢您更新此内容!

2> John..:

没有人发布完整的工作答案(很多例子使用Windows ::1,这对于现场(或"生产")环境可能会非常误导)任何地方(至少我能找到)所以这里是:

    存储的格式.

    INSERT使用相当复杂的IPv6 IP地址的示例查询.

    示例SELECT查询您将能够echo将IPv6 IP地址返回给客户端.

    进行故障排除以确保您没有错过任何遗留代码.

我更改了所有列名称以ipv6反映它们正确支持IPv6(并允许您保持旧列ip完好无损).可以将ip色谱柱存储在色谱柱中ipv6,然后DROP在确定转化功能完成后立即滴入色谱柱; 当我真的有时间时,我会将其添加到这篇文章中.

IPv6数据类型

正如前面提到ip的那样,直到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地址VARBINARY 16; 这是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');";

这将返回SELECT; 不,不是完整的IPv6(这是fe80::202:b3ff:fe1e:8329),它是一个浓缩/速记版本.有代码使它成为正式的完整版本,但这是为了节省自己和其他人的时间,因为这个 Q/A是不断出现的.

重要提示:仅仅因为一些 IPv6地址看起来就像他们会适合于FE80:0000:0000:0000:0202:B3FF:FE1E:8329意味着两分钟后,用更大的IPv6地址的人就不会停止,并造成严重破坏.

希望这将使一些人免于打开另外两打标签的疯狂.当我将来有时间时,我会添加额外的PHP代码,将精简的IPv6扩展为完整的正式格式.


故障排除

如果由于某种原因存储和/或检索IPv6地址对您不起作用,那么请自己获取高级查找和替换的副本(在Wine中比Linux的本机更快地工作bigint); 使用此主要是寻找,而不是取代.确保您的代码在软件的任何位置都保持一致.

所有grep变量都必须转换为$ip你知道你已经覆盖了这一点.

不要忘记删除$ipv6接下来四个步骤的结尾:

搜索PHP )函数的所有实例并将其删除.

搜索PHP inet_pton(函数的所有实例并将其删除.

搜索SQL inet_ntop(函数的所有实例并将其删除.

搜索SQL INET_ATON(函数的所有实例并将其删除.

搜索INET_NTOA(并确保所有IP-IN-TO-SQL实例都使用的$ipv6所有实例以及IP-FROM-SQL使用的所有实例INET6_ATON('$ipv6').

搜索所有实例INET6_NTOA(ipv6) AS ipv6并替换它们$row1['ip'].

确保所有情况下$row1['ipv6']使用下面的代码(与您的数据库对象的引用更改): $ipv6 =.

如果您开始调试之前意识到出现了问题,请确保您的测试使用经过测试的IP地址而不是可能出现故障的版本.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有