2011-02-27 123 views
80

可能重复:
How to store an IP in mySQL哪个MySQL数据类型用于IP地址?

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

是不是VARCHAR(n)

+0

看到这个[讨论](http://forums.mysql.com/read。 php?21,49094,49094#msg-49094) – Ragnar123 2011-02-27 13:57:27

+8

我不同意这是一个重复的问题,因为另一个问题特别是与性能相关的问题,用于存储大量的IP地址。这个问题的答案可能与对空间利用率或性能最大化不感兴趣的人无关。 – User 2012-09-11 01:25:32

+0

@用户我在一年半前问过这个问题;)但是感谢您分享您的意见。 – ComFreek 2012-09-11 08:12:42

回答

123

由于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']); 
+5

5.1的语法是INT UNSIGNED,而不是UNSIGNED INT – 2012-10-30 08:54:57

+0

使用建议的方法 - 如何查找匹配子网的地址? – 2015-11-17 09:34:32

+1

@AlexanderFarber [检查IP是否在子网中](http://stackoverflow.com/a/10002060/53114) – Gumbo 2015-11-17 19:07:50

39

有两种可行的(对于IPv4地址):

  • 一个varchar(15),如果你想将IP地址存储为一个字符串
    • 192.128.0.15例如
  • integer(4字节),如果您将IP地址为我


第二个解决方案之前使用需要在数据库中更小的空间,并可能是一个更好的选择的IP,即使这意味着位整数

  • 3229614095在存储和检索数据时的操作(将其从/转换为字符串)

    关于这些操作,请参阅ip2long()long2ip()功能,在PHP侧,或上的MySQL端inet_aton()inet_ntoa()

+0

但是我听说它也可以是$ _SERVER ['REMOTE_ADDR']中的IPv6地址。 我怎么能像xxx.xx.xx.xxx这样的东西转换成一个整数(4字节)像你说的? – ComFreek 2011-02-27 14:00:20

+1

对于IPv6地址,您需要超过4个字节 - https://secure.wikimedia.org/wikipedia/en/wiki/IPv6表示它使用128位,因此需要16个字节;;在PHP中,参见http://fr2.php.net/manual/en/function.inet-pton.php – 2011-02-27 14:03:34

+0

哪个数据类型对于1​​6字节是正确的? – ComFreek 2011-02-27 14:10:31

5

对于IPv4地址,可以使用VARCHAR将它们存储为字符串,但也会考虑将它们存储为长整数INT(11) UNSIGNED。您可以使用MySQL的INET_ATON()函数将它们转换为整数表示。这样做的好处是它允许你这样做对他们很容易比较,像BETWEEN查询

INET_ATON() MySQL function