1. 程式人生 > >MySQL中IP地址的儲存方式

MySQL中IP地址的儲存方式

原文地址: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次方。