如何透過mysql 利用inet_aton和inet_ntoa來處理ip位址數據

jacklove
發布: 2023-03-31 07:22:01
原創
1436 人瀏覽過

本文將介紹如何在資料庫中使用合適格式保存ip位址數據,並能方便的對ip位址進行比較的方法。

1.儲存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');
登入後複製

2.mysql inet_aton 與inet_ntoa 方法

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 |
+----+-----------+----------------+
登入後複製

#3.比較方法

如果需要找出在某個網段的使用者(例如:172.16.11.1 ~ 172.16.11.100),可以利用php的ip2long方法,把ip位址轉為整數,再進行比較。

<?php$ip_start = &#39;172.16.11.1&#39;;$ip_end = &#39;172.16.11.100&#39;;echo &#39;ip2long(ip_start):&#39;.sprintf(&#39;%u&#39;,ip2long($ip_start)); // 2886732545echo &#39;ip2long(ip_end):&#39;.sprintf(&#39;%u&#39;,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 出現負數原因及解決方法》

4.總結

1.將ip位址儲存到資料庫,使用unsigned int格式,插入時使用inet_aton方法把ip先轉為無符號整數,可以節省儲存空間。
2.顯示時使用inet_ntoa把整數ip位址轉為電位址。
3.php ip2long轉ip為整數時,需注意出現負數。

本文說明如何透過mysql 利用inet_aton和inet_ntoa來處理ip位址資料 ,更多相關內容請關注php中文網。

相關推薦:

php json資料使用gzip壓縮輸出的相關內容

如何透過php來使用http_build_query, parse_url,parse_str建立與解析url

如何透過html5實現搖晃的功能

以上是如何透過mysql 利用inet_aton和inet_ntoa來處理ip位址數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!