本文將介紹如何在數(shù)據(jù)庫中使用合適格式保存ip地址數(shù)據(jù),并能方便的對ip地址進行比較的方法。
1、保存ip地址到數(shù)據(jù)庫
數(shù)據(jù)庫中保存ip地址,字段一般會定義為:
`ip` char(15) NOT NULL,
因為ip地址(255.255.255.255)的最大長度是15,使用15位char已足夠。
創(chuàng)建表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;
插入幾條數(shù)據(jù)
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轉(zhuǎn)為無符號整型(4-8位)
inet_ntoa 把整型的ip轉(zhuǎn)為電地址
插入數(shù)據(jù)前,先用inet_aton把ip地址轉(zhuǎn)為整型,可以節(jié)省空間,因為char(15) 占16字節(jié)。
顯示數(shù)據(jù)時,使用inet_ntoa把整型的ip地址轉(zhuǎn)為電地址顯示即可。
例子:
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;
插入幾條數(shù)據(jù)
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、比較方法
如果需要找出在某個網(wǎng)段的用戶(例如:172.16.11.1 ~ 172.16.11.100),可以利用php的ip2long方法,把ip地址轉(zhuǎn)為整型,再進行比較。
?php
$ip_start = '172.16.11.1';
$ip_end = '172.16.11.100';
echo 'ip2long(ip_start):'.sprintf('%u',ip2long($ip_start)); // 2886732545
echo '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地址轉(zhuǎn)為整型時,對于大的ip會出現(xiàn)負數(shù),出現(xiàn)原因及處理方法可以參考我另一篇文章:《詳談php ip2long 出現(xiàn)負數(shù)的原因及解決方法》
4、總結(jié)
1、保存ip地址到數(shù)據(jù)庫,使用unsigned int格式,插入時使用inet_aton方法把ip先轉(zhuǎn)為無符號整型,可以節(jié)省存儲空間。
2、顯示時使用inet_ntoa把整型ip地址轉(zhuǎn)為電地址。
3、php ip2long轉(zhuǎn)ip為整型時,需要注意出現(xiàn)負數(shù)。
以上這篇mysql 使用inet_aton和inet_ntoa處理ip地址數(shù)據(jù)的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- MySQL存儲IP地址的方法
- mysql跨數(shù)據(jù)庫復(fù)制表(在同一IP地址中)示例
- 將IP地址轉(zhuǎn)換為整型數(shù)字的PHP方法、Asp方法和MsSQL方法、MySQL方法
- 利用mysql的inet_aton()和inet_ntoa()函數(shù)存儲IP地址的方法分享
- MySql通過ip地址進行訪問的方法