我知道这个问题已经被问过很多次了,但我找不到任何最终解决方案;所以这里是:
在不知道数据库的情况下,如何在数据库中使用最佳实践存储 IP(IPv4 和 IPv6)?这以用于 DB 抽象目的,例如 PHP PDO。
顺便说一句,我有 PHP 5.2.17,因为我需要 Windows 上的 PEAR。
人们一直建议将其存储为 varbinary(16) 并使用 mysql 函数 inet6_ntop 和 inet6_pton 将 IP 作为字符串来回传递;就像建议用 IPv6 函数扩展 MySQL 5一样。在 PHP 中,函数 inet_pton() 和 inet_ntop() 可以将 IPv4 和 IPv6 来回转换为二进制格式,正如这个问题中的ThiefMaster所建议的那样,但不清楚如何将二进制内容传递到 SQL INSERT/UPDATE 字符串(以及这些 php 函数仅在 windows 上的 php 5.3.0 中提供,即使可以对这些函数进行逆向工程)。我真的很喜欢Jake所做的事情以及他关于 DB 中 IP 的整数表示的结果,如果我要在我的数据库中实现它,这可能会在某个遥远的、不可预见的未来派上用场,但是我不确定使用 PHP PDO 进行数据库抽象的数据库交叉兼容性。这篇文章似乎提供了一个关于存储二进制值的接近答案,但是未转义的二进制注入字符串不是潜在的危险吗?此外,如果您遵循这条路线,如果某些开发人员想要进行一些快速查找,有多少 DB 可以将 varbinary(16)/int(128bit) 转换为代表性 IP?
在我看来,最简单的方法是将ip 字符串按原样插入到varchar(45)中。但是那些想要遵循复杂路线的人将如何使用 inet_ntop() 和 inet_pton() 函数在 PHP 中(反向工程为 djmaze(AT)dragonflycms(.)org或FF dot st的 MagicalTux 建议)存储并以二进制形式检索 IPv6?有人可以举一个使用 PDO from 的例子<?php $strIP = "2001:4860:b002::68"; ?>
,使用 INSERT 然后 SELECT 准备好的语句吗?
正如你所看到的,我已经完成了我的研究,但这个 IPv6 的最终良好实践对我来说并不清楚。