当前位置: 首页 > 面试题库 >

您如何使用php在任何数据库中将IP地址(v4或v6)存储为int类型?

东门文斌
2023-03-14
问题内容

我需要以最紧凑的方式存储IP地址,搜索不是问题。这还需要在使用任何数据库(MySQL,SQLite,Postgres等)的Windows,Linux和Mac上兼容。

多亏了PHP中的ip2long()和long2ip()函数,我可以将IP4地址转换为较小的int字段,而不是varchar(15)或其他内容。问题在于我们正处于向IP6过渡的阶段,这意味着大多数现有的最佳实践都在失败-
包括那些不适用于IP6的功能。此外,此处不提供特定于数据库的功能,例如INET_ATON()和INET_NTOA()。

那么,如何以在任何系统上都可以使用的方式将IP地址存储为INT(或其他紧凑格式)呢?

编辑: Wrang-wrang指向的线程提到使用inet_ntop()和inet_ptop()来打包和解压缩IP4或IP6。问题是它们仅在PHP / 5.1以上的Linux /
Mac上运行(这不是一个太大的问题),而在+5.3以上的Windows上运行(即是)。

如果这不是问题,那么它们是否替代了每个数据库中推荐的varbinary(16)字段?


问题答案:

您只需要选择一种存储128位的方式:

:: /
96-这是一个96位零值前缀,最初称为IPv4兼容地址。此类地址用于表示IPv6过渡技术中的IPv4地址。这样的IPv6地址的前96位设置为零,而后32位是表示的IPv4地址。Internet工程任务组(IETF)已不建议使用出版物RFC
4291中的IPv4兼容地址。该地址格式的唯一剩余用途是用固定大小的成员表示表或数据库中的IPv4地址,该成员也必须能够存储一个IPv6地址。

(摘自http://en.wikipedia.org/wiki/IPv6)



 类似资料:
  • 问题内容: 目前,我正在使用一项服务来执行操作,即从服务器检索数据,然后将数据存储在服务器本身上。 取而代之的是,我想将数据放入本地存储中,而不是将其存储在服务器上。我该怎么做呢? 问题答案: 这是我存储和检索到本地存储的代码的一部分。我使用广播事件来保存和恢复模型中的值。

  • 问题内容: 如何在MySQL数据库中存储和显示图像。到目前为止,我只编写了从用户那里获取图像并将其存储在文件夹中的代码,而到目前为止,我编写的代码是: HTML FILE PHP文件 问题答案: 我找到了答案,对于那些在这里寻找相同事物的人,我是怎么做的。您不应该考虑将图像上传到数据库,而是可以将上传文件的名称存储在数据库中,然后检索文件名,并在要显示图像的任何位置使用它。 HTML代码 PHP代

  • 问题内容: 我怎么做? 现在,将不会使用IPv6,但是我需要设计应用程序以使其支持IPv6。有必要在MySQL数据库中存储IP地址和CIDR块(也是BGP NLRI,但这是另一回事)。我一直将INT用于IPv4 +将TINYINT用于masklen,但是IPv6是128位。 哪种方法最适合呢??用于二进制存储?用于文本存储?在专用桌子上? 你会推荐什么? 问题答案: 我不确定哪款MySQL 是 正

  • 问题内容: 这个问题已经在这里有了答案 : 在Oracle中表示IPv4 / IPv6地址 (7个答案) 8年前关闭。 我创建了一个表来存储IP地址。 但是当我尝试插入表中时,它给了我一个错误: 无论如何,我可以在SQL表中存储一个带有很多小数位的数字,如果是的话,我应该使用什么数据类型?请指教。 提前致谢! 问题答案: 您有几种选择: 将其存储为VARCHAR。IP地址实际上不是您可能会做数学运

  • 我正在为我工作的一家公司申请工作。我有它来防止SQL注入和一些XSS技术。我的主要问题是保护敏感信息的安全,比如SSN和地址,因为公司需要它来为推销员制作1099表格。 我不知道如何做这部分,但是我应该加密所有内容,然后在它进入MySQL数据库时对其进行解密吗?

  • 问题内容: 可以同时容纳IPv4和IPv6地址的一种数据类型。我想存储IP地址以限制一个人可以在我的网站上通过他/她的机器进行配置的数量。 问题答案: IPv4地址使用32位(4字节),IPv6地址使用128位(16字节)。因此,您可以将它们的二进制表示形式存储在或字段中。