標籤:
為什麼要問如何儲存IP
首先就來闡明一下部分人得反問:為什麼要問IP得知怎樣存,直接varchar類型不久得了嗎?
其實做任何程式設計都要在功能實現的基礎上最大限度的最佳化效能。而資料庫設計是程式設計中不可忽略的一個重要部分,所以巧存IP地址可以一定程度獲得很大提升。
利用函數演算法處理
在MySQL中沒有直接提供IP類型欄位,但如果有兩個函數可以把IP與最大長度為10位元字類型互轉,所以使用int類型儲存IP比varchar類型儲存IP地址效能要提升很多,減少不少看空間。因為varchar是可變長形,需要多餘的一個位元組儲存長度。另外int型在邏輯運算上要比varchar速度快。
IP轉數字函數inet_aton()
我們轉換下幾個常用的IP地址
| 1234567891011121314151617181920212223 |
mysql> select inet_aton(‘255.255.255.255‘);+------------------------------+| inet_aton(‘255.255.255.255‘) |+------------------------------+| 4294967295 |+------------------------------+1 row in set (0.00 sec) mysql> select inet_aton(‘192.168.1.1‘); +--------------------------+| inet_aton(‘192.168.1.1‘) |+--------------------------+| 3232235777 |+--------------------------+1 row in set (0.00 sec) mysql> select inet_aton(‘10.10.10.10‘);+--------------------------+| inet_aton(‘10.10.10.10‘) |+--------------------------+| 168430090 |+--------------------------+1 row in set (0.00 sec) |
所以IP的表欄位可以設定為INT(10)就好,如果IP擷取不到可以直接存0代表擷取不到IP的意思
數字轉IP函數inet_ntoa()
| 12345678910111213141516171819202122232425262728293031 |
mysql> select inet_ntoa(4294967295);+-----------------------+| inet_ntoa(4294967295) |+-----------------------+| 255.255.255.255 |+-----------------------+1 row in set (0.00 sec) mysql> select inet_ntoa(3232235777); +-----------------------+| inet_ntoa(3232235777) |+-----------------------+| 192.168.1.1 |+-----------------------+1 row in set (0.00 sec) mysql> select inet_ntoa(168430090); +----------------------+| inet_ntoa(168430090) |+----------------------+| 10.10.10.10 |+----------------------+1 row in set (0.00 sec) mysql> select inet_ntoa(0); +--------------+| inet_ntoa(0) |+--------------+| 0.0.0.0 |+--------------+1 row in set (0.00 sec) |
注意,0轉換為 0.0.0.0
from:http://www.qttc.net/201208193.html
MySQL中應該怎樣儲存IP地址