【问题标题】:How do you store an IP Address (v4 or v6) as an int in any database using php?如何使用 php 在任何数据库中将 IP 地址(v4 或 v6)存储为 int?
【发布时间】:2009-09-06 22:47:54
【问题描述】:

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

感谢 PHP 中的 ip2long() 和 long2ip() 函数,我可以将 IP4 地址转换为一个小的 int 字段,而不是 varchar(15) 或其他什么。问题是我们正处于向 IP6 的过渡阶段,这意味着大多数现有的最佳实践都失败了——包括那些不适用于 IP6 的功能。此外,像 INET_ATON() 和 INET_NTOA() 这样的 DB 特定函数不是这里的选项。

那么,如何以适用于任何系统的方式将 IP 地址存储为 INT(或任何其他紧凑格式)?

编辑: The thread Wrang-wrang 指出使用 inet_ntop() 和 inet_ptop() 来打包和解包 IP4 或 IP6。问题是它们只能在带有 PHP +5.1(这不是一个太大的问题)的 Linux/Mac 和带有 +5.3(这是)的 Windows 上工作。

如果这不是问题,他们是否会替换每个数据库中推荐的 varbinary(16) 字段?

【问题讨论】:

  • 您可能想看看this SO thread。发帖人决定使用两个 BIGINT 字段来存储 IPv6 地址,但您可能还需要考虑其他建议。

标签: sql optimization ip-address


【解决方案1】:

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

::/96 — 这是一个 96 位的零值 前缀最初称为 IPv4 兼容地址。这节课 的地址被用来表示 IPv6 中的 IPv4 地址 过渡技术。这样的 IPv6 地址的前 96 位设置为 零,而它的最后 32 位是 表示的 IPv4 地址。这 互联网工程任务组 (IETF) 已弃用 IPv4 兼容地址 发布 RFC 4291。唯一的 此地址格式的剩余使用 是表示一个 IPv4 地址 具有固定大小的表或数据库 成员也必须能够 存储 IPv6 地址。

(来自http://en.wikipedia.org/wiki/IPv6

我认为两个 BIGINT UNSIGNED 是存储它们的合理方式,但我想你可以使用二进制(字节数组)。

Working with IPv6 Addresses in PHPHow to store IPv6-compatible address in a relational database 似乎已经回答了这个问题

【讨论】:

    【解决方案2】:

    您可以使用这个universal php library:它的ip2longlong2ip 方法适用于IPv4 和IPv6。

    【讨论】:

    猜你喜欢
    • 2011-10-30
    • 2011-09-19
    • 1970-01-01
    • 2014-06-21
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多