MySQL存儲IP地址的辦法。本站提示廣大學習愛好者:(MySQL存儲IP地址的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL存儲IP地址的辦法正文
為何要問若何存儲IP?
起首就來說明一下部門人得反問:為何要問IP得如何存,直接varchar類型不就得了嗎?
其實做任何法式設計都要在功效完成的基本上最年夜限制的優化機能。而數據庫設計是法式設計中弗成疏忽的一個主要部門,所以巧存IP地址可以必定水平取得很年夜晉升。
應用函數算法處置
在MySQL中沒有直接供給IP類型字段,但假如有兩個函數可以把IP與最年夜長度為10位數字類型互轉,所以應用int類型存儲IP比varchar類型存儲IP地址機能要晉升許多,削減很多空間。由於varchar是可變長形,須要過剩的一個字節存儲長度。別的int型在邏輯運算上要比varchar速度快。
IP轉數字函數inet_aton()
我們轉換下幾個經常使用的IP地址
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()
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
整型字段的比擬比字符串效力高許多,這也相符一項優化准繩:字段類型界說應用最適合(最小),最簡略的數據類型。
inet_aton()算法,其實借用了國際上對列國IP地址的辨別中應用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。
以上講授的就是MySQL存儲IP地址的辦法,願望可以或許對年夜家的進修有所贊助。