MySQL中IP地址的儲存方式
阿新 • • 發佈:2018-11-19
原文地址:http://www.cnblogs.com/cnsanshao/p/3326648.html
為什麼要問如何儲存IP
首先就來闡明一下部分人得反問:為什麼要問IP得怎樣存,直接varchar型別不就得了嗎?
其實做任何程式設計都要在功能實現的基礎上最大限度的優化效能。而資料庫設計是程式設計中不可忽略的一個重要部分,所以巧存IP地址可以一定程度獲得很大提升。
利用函式演算法處理
在MySQL中沒有直接提供IP型別欄位,但如果有兩個函式可以把IP與最大長度為10位數字型別互轉,所以使用int型別儲存IP比varchar型別儲存IP地址效能要提升很多,減少不少空間。因為varchar是可變長形,需要多餘的一個位元組儲存長度。另外int型在邏輯運算上要比varchar速度快。
IP轉數字函式inet_aton()
我們轉換下幾個常用的IP地址
01 |
mysql> select inet_aton( '255.255.255.255' ); |
02 |
+------------------------------+ |
03 |
| inet_aton( '255.255.255.255' ) | |
04 |
+------------------------------+ |
05 |
| 4294967295 | |
06 |
+------------------------------+ |
07 |
1 row in set (0.00 sec) |
08 |
09 |
mysql> select inet_aton( '192.168.1.1' ); |
10 |
+--------------------------+ |
11 |
| inet_aton( '192.168.1.1' ) | |
12 |
+--------------------------+ |
13 |
| 3232235777 | |
14 |
+--------------------------+ |
15 |
1 row in set (0.00 sec) |
16 |
17 |
mysql> select inet_aton( '10.10.10.10' ); |
18 |
+--------------------------+ |
19 |
| inet_aton( '10.10.10.10' ) | |
20 |
+--------------------------+ |
21 |
| 168430090 | |
22 |
+--------------------------+ |
23 |
1 row in set (0.00 sec) |
所以IP的表字段可以設定為INT(10)就好,如果IP獲取不到可以直接存0代表獲取不到IP的意思
--例項IP字串轉整數
insert into ipint(ip) VALUES(INET_ATON('1.1.1.2'));
數字轉IP函式inet_ntoa()
01 |
mysql> select inet_ntoa(4294967295); |
02 |
+-----------------------+ |
03 |
| inet_ntoa(4294967295) | |
04 |
+-----------------------+ |
05 |
| 255.255.255.255 | |
06 |
+-----------------------+ |
07 |
1 row in set (0.00 sec) |
08 |
09 |
mysql> select inet_ntoa(3232235777); |
10 |
+-----------------------+ |
11 |
| inet_ntoa(3232235777) | |
12 |
+-----------------------+ |
13 |
| 192.168.1.1 | |
14 |
+-----------------------+ |
15 |
1 row in set (0.00 sec) |
16 |
17 |
mysql> select inet_ntoa(168430090); |
18 |
+----------------------+ |
19 |
| inet_ntoa(168430090) | |
20 |
+----------------------+ |
21 |
| 10.10.10.10 | |
22 |
+----------------------+ |
23 |
1 row in set (0.00 sec) |
24 |
25 |
mysql> select inet_ntoa(0); |
26 |
+--------------+ |
27 |
| inet_ntoa(0) | |
28 |
+--------------+ |
29 |
| 0.0.0.0 | |
30 |
+--------------+ |
31 |
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次方。