2012-05-14 197 views
6

好吧,現在我知道類似的問題可能已經被提出了一百萬次,但我真的是新手,我非常感謝您的幫助。在MySQL數據庫(IPv4和IPv6)中存儲IP地址

基本上,我想將訪問者IP地址存儲在MySQL中供以後檢索和驗證。我首先需要知道需要使用什麼類型的字段來存儲IP地址。如果可能,我還想使系統與IPv6地址兼容。

在此先感謝

+1

你對地址的主要用例是什麼?你要查詢他們嗎?將它們拆分並根據一些子網規則進行查詢?或者他們存儲只是爲了顯示? –

+2

試試這個:http://stackoverflow.com/questions/2049681/store-ipv6-in-database – Mark

+0

那麼它的確認鏈接。我想確保確認鏈接是從它生成的相同IP地址訪問的。所以我要去查詢他們] – Andy

回答

9

要存儲在IPv4可以使用一個INT UNSIGNED ,而對於IPv6的你需要一個decimal(39,0),存儲在表中的IP,您可以使用功能INET_ATON

INSERT INTO table (ipcol) VALUES (INET_ATON('192.168.0.10')); 

與功能INET_NTOA檢索回:

SELECT INET_NTOA(ipcol) AS ip FROM table; 

這個答案在MySQL IPv6支持之前就存在了; 用戶應該意識到MySQL現在本身支持IPv6:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html

+0

謝謝,但我想我剛剛讀到'INET_ATON()'不支持IPv6。即使這樣做,我如何使用PHP獲取IPv6地址? – Andy

+0

嘗試使用inet_pton:http://php.net/manual/en/function.inet-pton.php – aleroot

+0

夠公平的,謝謝。現在,我該如何去查找PHP中的用戶IP地址? – Andy

1

有在MySQL大到足以存儲一個IPv6地址無整數類型。最緊湊的存儲方式就像BINARY(16)。如果您只需要存儲和檢索地址,並且您不需要對它們執行邏輯操作(例如,網絡掩碼操作來查詢哪些IP地址位於覆蓋前綴下),那就足夠了。如果您需要進行邏輯或位操作,您需要更加奇特:您需要將IPv6地址存儲在兩個獨立的64位整數列中。

+0

不,我不需要做任何更花哨的事情(只是在查詢中檢索/比較它們)。所以我現在需要知道的是如何使用PHP獲取用戶的IP地址? – Andy

4

我使用VARBINARY(16),用於對數據類型和使用MySQL函數INET_ATON()插入IP號碼(我使用反向功能,INET_NTOA()稍後讀取。

+0

那麼,VARBINARY(16)會支持IPv4和IPv6嗎?我如何使用PHP找到訪問者的IP地址? – Andy

+1

你必須使用INET6_NTOA和INTE6_ATON,但是直到版本5.6.3才能在MySQL中使用 –