2011-02-27 121 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