本文将介绍如何在数据库中使用合适格式保存ip地址数据,并能方便的对ip地址进行比较的方法。
1、保存ip地址到数据库
数据库中保存ip地址,字段一般会定义为:
`ip` char(15) NOT NULL,
因为ip地址(255.255.255.255)的最大长度是15,使用15位char已足够。
创建表user
1
2
3
4
5
6
|
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;
|
插入几条数据
1
2
3
4
|
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地址转为电地址显示即可。
例子:
1
2
3
4
5
6
|
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;
|
插入几条数据
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 |
+ ----+-----------+------------+
|
查询显示为电地址
1
2
3
4
5
6
7
8
|
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地址转为整型,再进行比较。
1
2
3
4
5
6
7
|
<?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
?>
|
查询:
1
2
3
4
5
6
|
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地址数据的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。