我需要以尽可能最紧凑的方式存储 IP 地址,搜索不是问题。这还需要在使用任何数据库(MySQL、SQLite、Postgres 等)的 Windows、Linux 和 Mac 上兼容。
感谢ip2long() https://www.php.net/manual/en/function.ip2long.php和 PHP 中的 long2ip() 函数我可以将 IP4 地址转换为小型 int 字段,而不是 varchar(15) 或其他字段。问题是我们正处于向 IP6 的过渡阶段,这意味着大多数现有的最佳实践都失败了 - 包括那些不适用于 IP6 的功能。此外,像 INET_ATON() 和 INET_NTOA() 这样的数据库特定函数不是这里的选项。
那么如何以可在任何系统上运行的方式将 IP 地址存储为 INT(或任何其他紧凑格式)呢?
EDIT:
线程 https://stackoverflow.com/questions/444966/working-with-ipv6-addresses-in-phpWrang-wrang 提到了使用 inet_ntop() 和 inet_ptop() 来打包和解包 IP4 或 IP6。问题是它们只能在 Linux/Mac 上运行 PHP +5.1(这不是一个太大的问题),在 Windows 上运行 +5.3(这不是一个太大的问题)。
如果这不是问题,那么它们是否会替换每个数据库中推荐的 varbinary(16) 字段?
您只需要选择一种存储 128 位的方式:
::/96 — 这是一个 96 位零值
前缀最初称为
IPv4 兼容地址。这个班
地址用于表示
IPv6 内的 IPv4 地址
过渡技术。这样的IPv6
地址的前 96 位设置为
零,而它的最后 32 位是
所表示的 IPv4 地址。这
互联网工程任务组 (IETF)
已弃用
IPv4 兼容地址
出版物 RFC 4291。唯一
此地址格式的剩余使用量
是表示一个IPv4地址
具有固定大小的表或数据库
成员还必须能够
存储 IPv6 地址。
(from http://en.wikipedia.org/wiki/IPv6 http://en.wikipedia.org/wiki/IPv6)
我认为两个 BIGINT UNSIGNED 是存储它们的合理方法,但我想你可以使用二进制(字节数组)。
这个问题似乎已经在在 PHP 中使用 IPv6 地址 https://stackoverflow.com/questions/444966/working-with-ipv6-addresses-in-php and 如何在关系数据库中存储 IPv6 兼容地址 https://stackoverflow.com/questions/420680/how-to-store-ipv6-compatible-address-in-a-relational-database
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)