香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > MYSQL >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

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


时间:2020-11-03 13:29 作者:admin610456


本文将介绍如何在数据库中使用合适格式保存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/' target='_blank'>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 = '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 出现负数的原因及解决方法》

4、总结

1、保存ip地址到数据库,使用unsigned int格式,插入时使用inet_aton方法把ip先转为无符号整型,可以节省存储空间。

2、显示时使用inet_ntoa把整型ip地址转为电地址。

3、php ip2long转ip为整型时,需要注意出现负数。

以上这篇mysql 使用inet_aton和inet_ntoa处理ip地址数据的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)