MySQL 的inet_aton()和inet_ntoa()函數存儲IP地址

當前很多應用都適用字符串char(15)來存儲IP地址(佔用16個字節),利用inet_aton()和inet_ntoa()函數,來存儲IP地址效率很高,適用unsigned int 就可以滿足需求,不需要使用bigint,只需要4個字節,節省存儲空間,同時效率也高很多

 

爲什麼要問如何存儲IP?

首先就來闡明一下部分人得反問:爲什麼要問IP得怎樣存,直接varchar類型不就得了嗎?

其實做任何程序設計都要在功能實現的基礎上最大限度的優化性能。而數據庫設計是程序設計中不可忽略的一個重要部分,所以巧存IP地址可以一定程度獲得很大提升。

利用函數算法處理

在MySQL中沒有直接提供IP類型字段,但如果有兩個函數可以把IP與最大長度爲10位數字類型互轉,所以使用int類型存儲IP比varchar類型存儲IP地址性能要提升很多,減少不少空間。因爲varchar是可變長形,需要多餘的一個字節存儲長度。另外int型在邏輯運算上要比varchar速度快。

unsigned介紹


整型的每一種都分有無符號(unsigned)和有符號(signed)兩種類型(float和double總是帶符號的),在默認情況下聲明的整型變量都是有符號的類型(char有點特別),如果需聲明無符號類型的話就需要在類型前加上unsigned。無符號版本和有符號版本的區別就是無符號類型能保存2倍於有符號類型的正整數數據,比如16位系統中一個int能存儲的數據的範圍爲-32768~32767,而unsigned能存儲的數據範圍則是0~65535。由於在計算機中,整數是以補碼形式存放的。根據最高位的不同,如果是1,有符號數的話就是負數;如果是無符號數,則都解釋爲正數。另外,unsigned若省略後一個關鍵字,大多數編譯器都會認爲是unsigned int。


mysql提供了兩個方法來處理ip地址
inet_aton 把ip轉爲無符號整型(4-8位) 
inet_ntoa 把整型的ip轉爲電地址
插入數據前,先用inet_aton把ip地址轉爲整型,可以節省空間,因爲char(15) 佔16字節。 
顯示數據時,使用inet_ntoa把整型的ip地址轉爲電地址顯示即可。

mysql> create table user_bye (ip int unsigned, name varchar(10));

mysql> insert into user_bye values(inet_aton('192.168.1.200'), '張三');

mysql> insert into user_bye values(inet_aton('24.89.35.27'), '李四'), (inet_aton('100.200.30.22'), '王五');

mysql> select * from user_bye;

+------------+------+ 
| ip         | name | 
+------------+------+ 
| 3232235976 | 張三 |
| 408494875  | 李四 | 
| 1690836502 | 王五 | 
+------------+------+ 

mysql> select * from user_bye where ip = inet_aton('192.168.1.200'); 

+------------+------+ 
| ip         | name | 
+------------+------+ 
| 3232235976 | 張三 |
+------------+------+ 

mysql> select inet_ntoa(ip) from user_bye; 

+--------------------+ 
| inet_ntoa(ip)      | 
+--------------------+ 
| 192.168.1.200      |
| 24.89.35.27        |
| 100.200.30.22      |
+--------------------+

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章