哪个MySQL数据types用于IP地址?

可能重复:
如何在mySQL中存储一个IP

我想从$_SERVER['REMOTE_ADDR']和一些其他$_SERVERvariables获得IP地址,哪种数据types是正确的呢?

它是VARCHAR(n)吗?

由于IPv4地址长度为4个字节,所以可以使用一个完全具有4个字节的INTUNSIGNED ) :

 `ipv4` INT UNSIGNED 

INET_ATONINET_NTOA来转换它们:

 INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1")); SELECT INET_NTOA(`ipv4`) FROM `table`; 

对于IPv6地址,您可以使用BINARY代替:

 `ipv6` BINARY(16) 

并使用PHP的inet_ptoninet_ntop进行转换:

 'INSERT INTO `table` (`ipv6`) VALUES ("'.mysqli_real_escape_string(inet_pton('2001:4860:a005::68')).'")' 'SELECT `ipv6` FROM `table`' $ipv6 = inet_pton($row['ipv6']); 

您有两种可能性(对于IPv4地址):

  • 一个varchar(15) ,如果你想存储的IP地址作为一个string
    • 例如192.128.0.15
  • 一个integer (4个字节),如果您将IP地址转换为整数
    • 3229614095为我以前使用的IP

第二个解决scheme将需要更less的数据库空间,并且可能是更好的select,即使在存储和检索数据(将其从string转换为string)中隐含了一些操作。

关于这些操作,请参阅PHP端的ip2long()long2ip()函数,或MySQL端的inet_aton()inet_ntoa()

对于IPv4地址,可以使用VARCHAR将它们存储为string,但也可以将它们存储为长整数INT(11) UNSIGNED 。 您可以使用MySQL的INET_ATON()函数将它们转换为整型表示。 这样做的好处是它可以让你对它们进行简单的比较,比如BETWEEN查询

INET_ATON()MySQL函数