本文將介紹如何在資料庫中使用合適格式保存ip位址數據,並能方便的對ip位址進行比較的方法。
#資料庫中儲存ip位址,欄位一般會定義為:
`ip` char(15) NOT NULL,
因為ip位址(255.255.255.255)的最大長度是15,使用15位元char已足夠。
建立表格user
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `ip` char(15) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
插入幾個資料
INSERT INTO `user` (`id`, `name`, `ip`) VALUES(2, 'Abby', '192.168.1.1'), (3, 'Daisy', '172.16.11.66'), (4, 'Christine', '220.117.131.12');
mysql提供了兩個方法來處理ip位址
inet_aton 把ip轉為無符號整型(4-8位元)
inet_ntoa 把整型的ip轉為電位址
插入資料前,先用inet_aton把ip位址轉為整數,可以節省空間,因為char(15) 佔16位元組。
顯示資料時,使用inet_ntoa把整型的ip位址轉為電位址顯示即可。
範例:
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `ip` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
插入幾個資料
INSERT INTO `user` (`id`, `name`, `ip`) VALUES(2, 'Abby', inet_aton('192.168.1.1')), (3, 'Daisy', inet_aton('172.16.11.66')), (4, 'Christine', inet_aton('220.117.131.12'));
mysql> select * from `user`; +----+-----------+------------+| id | name | ip | +----+-----------+------------+| 2 | Abby | 3232235777 | | 3 | Daisy | 2886732610 || 4 | Christine | 3698688780 | +----+-----------+------------+
查詢顯示為電位址
mysql> select id,name,inet_ntoa(ip) as ip from `user`; +----+-----------+----------------+| id | name | ip | +----+-----------+----------------+| 2 | Abby | 192.168.1.1 | | 3 | Daisy | 172.16.11.66 || 4 | Christine | 220.117.131.12 | +----+-----------+----------------+
如果需要找出在某個網段的使用者(例如:172.16.11.1 ~ 172.16.11.100),可以利用php的ip2long方法,把ip位址轉為整數,再進行比較。
<?php$ip_start = '172.16.11.1';$ip_end = '172.16.11.100';echo 'ip2long(ip_start):'.sprintf('%u',ip2long($ip_start)); // 2886732545echo 'ip2long(ip_end):'.sprintf('%u',ip2long($ip_end)); // 2886732644?>
查詢:
mysql> select ip,name,inet_ntoa(ip) as ip from `user` where ip>=2886732545 and ip<=2886732644; +------------+-------+---------------+| ip | name | ip | +------------+-------+---------------+| 2886732610 | Daisy | 172.16.11.66 | +------------+-------+---------------+
注意:使用ip2long方法把ip位址轉為整數時,對於大的ip會出現負數,出現原因及處理方法可以參考我另一篇文章:《php ip2long 出現負數原因及解決方法》
1.將ip位址儲存到資料庫,使用unsigned int格式,插入時使用inet_aton方法把ip先轉為無符號整數,可以節省儲存空間。
2.顯示時使用inet_ntoa把整數ip位址轉為電位址。
3.php ip2long轉ip為整數時,需注意出現負數。
本文說明如何透過mysql 利用inet_aton和inet_ntoa來處理ip位址資料 ,更多相關內容請關注php中文網。
相關推薦:
如何透過php來使用http_build_query, parse_url,parse_str建立與解析url
以上是如何透過mysql 利用inet_aton和inet_ntoa來處理ip位址數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!