哪个MySQL数据类型用于IP地址?

时间:2011-02-27 13:54:51

标签: php mysql types ip-address

  

可能重复:
  How to store an IP in mySQL

我想从$_SERVER['REMOTE_ADDR']和其他一些$_SERVER变量中获取IP地址,哪种数据类型是正确的?

VARCHAR(n)吗?

3 个答案:

答案 0 :(得分:134)

由于IPv4地址长度为4个字节,因此您可以使用恰好有4个字节的INT (UNSIGNED)

`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’s 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']);

答案 1 :(得分:46)

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

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


第二个解决方案将需要更少的数据库空间,并且可能是一个更好的选择,即使它在存储和检索数据(将其从/转换为字符串)时意味着一些操作。 / p>

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

答案 2 :(得分:5)

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

INET_ATON() MySQL function