考试首页 | 考试用书 | 培训课程 | 模拟考场 | 考试论坛  
  当前位置:编程开发 > MYSQL > 文章内容
  

Mysql教程:mysql使用inet_aton和inet_ntoa处理ip地址数据的实例

 [ 2017年8月25日 ] 【

  本文将介绍如何在数据库中使用合适格式保存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
$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地址数据的实例就是小编分享给大家的全部内容了

本文纠错】【告诉好友】【打印此文】【返回顶部
将考试网添加到收藏夹 | 每次上网自动访问考试网 | 复制本页地址,传给QQ/MSN上的好友 | 申请链接 | 意见留言 TOP
关于本站  网站声明  广告服务  联系方式  站内导航  考试论坛
Copyright © 2007-2013 中华考试网(Examw.com) All Rights Reserved