1. 程式人生 > >MySQL怎樣存儲IP地址

MySQL怎樣存儲IP地址

pan 基本 pre 速度 light 數字 簡單的 .cn 可變

這兩天面試,借貸寶面試官有問到你之前的項目是如何存儲ip地址的,我的回答是,存儲為varchar字符串類型(事實上我之前參與的項目中的確是采用varchar類型來存儲的,但現在想想,當時的場景也僅僅是記錄用戶操作的地址,也沒什麽太多用途)。

然後,面試官又問我,那你如何查找出A類IP地址的內容,這個時候我就懵了,因為我根本不知道IP地址還分類別,只知道基本格式是從0.0.0.0 ~ 255.255.255

所以,面試也是一種知識的學習,只可惜過程太痛苦,年輕的時候多學點總不是壞處,後悔當初在公司裏面太安逸了。下面是在園內找的一篇文章,很好的解釋了如何存儲ip地址的問題,關於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‘) |
+--------------------------+
|               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次方。

轉自:http://www.cnblogs.com/cnsanshao/p/3326648.html

MySQL怎樣存儲IP地址