2011-06-21 168 views
53

mysql中IP地址的正確字段類型是什麼?什麼是使用PHP存儲它的正確方法?使用PHP存儲在MySQL數據庫中的IP地址

+0

取決於你想用它做什麼,以及你關心的是哪個版本的IP。 –

+0

取決於你將如何使用它,但通常,認爲varchar會更好 – Balanivash

+1

這可能會幫助你:http://stackoverflow.com/questions/1038950/what-is-be-the-most-appropriate-data-一種類型 - 儲存 - 一個IP地址的功能於SQL服務器? – Alfred

回答

14

通常,您可以使用VARCHAR(45),因爲它將足夠長,甚至可以存儲IPv6。

+7

如果您擁有隧道地址,則IPv6可以是45個字符。當然,這是一個邊緣案例,但爲什麼不是未來的證明。 – Robert

+0

哦,是的,忘了:) – Sander

+4

所以,你基本上使用多達45個字節的地址使用16字節最大?看起來對我來說很浪費......(ipv4地址變得更糟:4字節地址和15字節字符串重新編號) – knittl

46

您可以將它們存儲在長度爲128位(16字節,BINARY(16)VARBINARY(16))的二進制字段中。 要將任何ip地址轉換爲其二進制表示形式,可以使用php函數inet_pton。此方法將適用於IPv4和IPv6地址。 inet_ntop可以用來取回儲存的IP地址的字符串表示(不管版本)

+0

我可以在IPv6和IPv4上使用它嗎? – user552828

+2

@ user552828:是的,您可以將其用於ipv4和ipv6 – knittl

+0

,但他們說IPv6可以長45個字符隧道IP,所以是128位長度可以嗎?我問,因爲我不太善於編碼,我是新手 – user552828

59

This tutorial可能會幫助你。

保存IPv4地址的最有效方法是使用INT字段(不像您期望的那樣使用VARCHAR)。您可以使用PHP的ip2long轉換它們,並使用MySQL的INET_NTOA函數或PHP的long2ip函數進行轉換。

如果您需要存儲IPv6,則需要使用BINARY字段,而不是PHP的inet_pton函數。

+0

沒有名爲'ip2bin'的內建函數。你可以很容易地自己寫一個:'function ip2bin($ ip){return inet_pton($ ip); }' – knittl

+0

@knittl - 我添加了我所指的功能。我不好,不包括它。 –

+4

@francois:爲什麼不簡單地使用'inet_pton'?它已經可以處理幾乎所有的IP地址的字符串表示,不需要複雜的轉換 – knittl

相關問題