【发布时间】: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