使用PHP将IP地址存储在MySQL数据库中[重复]
Posted
技术标签:
【中文标题】使用PHP将IP地址存储在MySQL数据库中[重复]【英文标题】:IP address storing in MySQL database using PHP [duplicate] 【发布时间】:2011-09-19 15:28:36 【问题描述】:mysql中IP地址的正确字段类型是什么?以及使用 php 存储它的正确方法是什么?
【问题讨论】:
取决于你想用它做什么,以及你关心的IP版本。 这可能对你有帮助:***.com/questions/1038950/…? 在这种情况下,使用 VARCHAR(39) 这样您就可以存储所有版本的 IP 我同时关心 IPv4 和 IPv6 @user552828, @Sander - 在 VARCHAR 字段中保存 IP 地址效率极低。看看我的回答。 【参考方案1】:This tutorial 可能会对您有所帮助。
保存 IPv4 地址的最有效方法是使用 INT 字段(不是您可能期望的 VARCHAR)。您可以使用 PHP 的 ip2long
转换它们,然后使用 MySQL 的 INET_NTOA
函数或 PHP 的 long2ip
函数。
如果您需要存储 IPv6,则需要使用 BINARY 字段和 PHP 的 inet_pton
函数。
【讨论】:
没有名为ip2bin
的内置函数。不过,您可以轻松地自己写一个:function ip2bin($ip) return inet_pton($ip);
@knittl - 我添加了我所指的功能。不包括它是我的坏事。
@francois:为什么不直接使用inet_pton
?它已经适用于几乎所有 IP 地址的字符串表示形式,无需复杂的转换
@knittl - 这是一个很好的观点,实际上。让我更新我的答案。
如果您运行的是 64 位系统,MySQL INT 字段必须是 UNSIGNED【参考方案2】:
您可以将它们存储在长度为 128 位(16 字节,BINARY(16)
或 VARBINARY(16)
)的二进制字段中。
要将任何 ip 地址转换为其二进制表示,您可以使用 php 函数inet_pton
。此方法适用于 IPv4 和 IPv6 地址。 inet_ntop
可用于取回存储的 ip 地址的字符串表示形式(无论版本)
【讨论】:
我可以同时用于 IPv6 和 IPv4 @user552828:是的,你可以将它用于 ipv4 和 ipv6 但他们说 IPv6 在隧道 ip 的情况下可以是 45 个字符长,那么 128 位长度可以吗?我问是因为我不太擅长编码,我是新手pton
= 演示文稿到网络。 ntop
= 网络到演示文稿。
@knittl 在这种情况下,BINARY(16)
似乎不适合使用。看看这个链接:***.com/q/55347251/1640660 所以应该改用VARBINARY(16)
。【参考方案3】:
通常您可以使用 VARCHAR(45),因为它甚至可以存储 IPv6。
【讨论】:
如果您有隧道地址,IPv6 可以是 45 个字符。当然这是一个边缘案例,但为什么不是未来的证明。 哦,是的,忘记了:) 那么,对于最多使用 16 个字节的地址,您基本上最多使用 45 个字节?对我来说似乎很浪费......(使用 ipv4 地址变得更糟:4 字节地址和 15 字节字符串 repr。) @Knittl 你不使用 VARCHAR 的空数据,那只是 CHAR,见这个:dev.mysql.com/doc/refman/5.0/en/char.html 是的,这就是为什么我写“15 字节的 ipv4 地址”而不是 45 字节。它仍然使用大约 4 倍于必要的空间以上是关于使用PHP将IP地址存储在MySQL数据库中[重复]的主要内容,如果未能解决你的问题,请参考以下文章
PHP:在存储到 MySQL 数据库之前剥离链接(正则表达式剥离?)[重复]