2011-06-21 102 views
53

mysql中IP地址的正确字段类型是什么?什么是使用PHP存储它的正确方法?使用PHP存储在MySQL数据库中的IP地址

+0

取决于你想用它做什么,以及你关心的是哪个版本的IP。 –

+0

取决于你将如何使用它,但通常,认为varchar会更好 – Balanivash

+1

这可能会帮助你:http://stackoverflow.com/questions/1038950/what-is-be-the-most-appropriate-data-一种类型 - 储存 - 一个IP地址的功能于SQL服务器? – Alfred

回答

14

通常,您可以使用VARCHAR(45),因为它将足够长,甚至可以存储IPv6。

+7

如果您拥有隧道地址,则IPv6可以是45个字符。当然,这是一个边缘案例,但为什么不是未来的证明。 – Robert

+0

哦,是的,忘了:) – Sander

+4

所以,你基本上使用多达45个字节的地址使用16字节最大?看起来对我来说很浪费......(ipv4地址变得更糟:4字节地址和15字节字符串重新编号) – knittl

46

您可以将它们存储在长度为128位(16字节,BINARY(16)VARBINARY(16))的二进制字段中。 要将任何ip地址转换为其二进制表示形式,可以使用php函数inet_pton。此方法将适用于IPv4和IPv6地址。 inet_ntop可以用来取回储存的IP地址的字符串表示(不管版本)

+0

我可以在IPv6和IPv4上使用它吗? – user552828

+2

@ user552828:是的,您可以将其用于ipv4和ipv6 – knittl

+0

,但他们说IPv6可以长45个字符隧道IP,所以是128位长度可以吗?我问,因为我不太善于编码,我是新手 – user552828

59

This tutorial可能会帮助你。

保存IPv4地址的最有效方法是使用INT字段(不像您期望的那样使用VARCHAR)。您可以使用PHP的ip2long转换它们,并使用MySQL的INET_NTOA函数或PHP的long2ip函数进行转换。

如果您需要存储IPv6,则需要使用BINARY字段,而不是PHP的inet_pton函数。

+0

没有名为'ip2bin'的内建函数。你可以很容易地自己写一个:'function ip2bin($ ip){return inet_pton($ ip); }' – knittl

+0

@knittl - 我添加了我所指的功能。我不好,不包括它。 –

+4

@francois:为什么不简单地使用'inet_pton'?它已经可以处理几乎所有的IP地址的字符串表示,不需要复杂的转换 – knittl

相关问题