使用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获取计算机的IP地址

将IP存储到mysql数据库中

PHP:在存储到 MySQL 数据库之前剥离链接(正则表达式剥离?)[重复]

如何比较mysql数据库中的IP地址?

PHP - 如何在 MySql 中使用 GeoLite2 IP CSV 数据库?

连接到另一个IP(服务器)上的MySQL,PHP [重复]