2014-03-25 98 views
7

我希望能夠在我的表中存儲IPv4和IPv6地址。無論是IPv4還是IPv6地址,存儲用戶IP地址的最有效方式是什麼?將IPv4和IPv6地址存儲在單個列中

這將在生產環境中使用,所以未來經過驗證的建議是首選。

+0

IPv4地址長度爲32位。 IPv6地址長度爲128位。對於存儲效率,IPv6地址可以存儲在「BINARY(16)」列中,但這對於IPv4地址來說效率較低,在「INT UNSIGNED」列中會更好。 – AeroX

+1

相關:http://stackoverflow.com/questions/4444771/how-to-store-a-128-bit-number-in-a-single-column-in-mysql – AeroX

+0

@AeroX如果我使用'BINARY(16 )',我將能夠存儲的IP地址是例如192.168.1.2或我需要執行一些轉換 – user2650277

回答

1

爲什麼它必須是單列?一些建議...

有2列,一個用於IPv4,一個用於IPv6。

存儲在一個單獨列的IP地址,並有另一列,基本上保持一個布爾值該地址是IPv4還是不...

+2

這將是一個浪費資源,因爲ipaddress並不那麼重要。我的意思是,它將從數據庫只在極少數情況下。只有一個版本是需要的 – user2650277

7

我會推薦給存儲IPv6格式的每個地址。有一個官方映射:IPv4-mapped IPv6 address。它的工作原理是這樣的:

就拿IPv4地址192.0.2.44
IPv4映射的IPv6地址將::ffff:192.0.2.44
這也可以寫成::ffff:c000:022c192十進制是c0十六進制等)

你可以使用inet_pton()函數來解析這些地址,並且在我的本地系統上,inet_ntop()函數也會以最易讀的格式(::ffff:192.0.2.44)輸出它們。這樣你的應用程序中只有一種格式可以處理。

另請參閱this related answer

+0

每個ipv4地址都有一個ipv6等價物嗎?。我也能夠將這些ipv6地址轉換回ipv4.Can你建議最好的數據類型和大小需要存儲ipv6的MySQL – user2650277

+1

對IPv6地址使用BINARY(16),如果按照「相關答案」鏈接,您將看到如何轉換回來。 –