时间:2021-05-24
本文将介绍如何在数据库中使用合适格式保存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地址转为电地址显示即可。
例子:
插入几条数据
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地址数据的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
有个统计需求,需要对IP进行分类统计,Mysql提供了inet_aton()和inet_ntoa()函数进程处理。具体可以查看官方手册。INET_ATON(ex
C语言inet_ntoa()函数:将网络二进制的数字转换成网络地址头文件:#include#include#include定义函数:char*inet_ntoa
inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换,而且inet_pton和inet_ntop这2个函数能够处理
erlang的DNS解析,有个inet模块,可以做这个事情,对应的api如下:(这里用的R16B的版本)inet:getaddr/2解析对应一个ip,而in
java网络编程java.net类InetAddress此类表示互联网协议(IP)地址。会抛出异常UnknownHostException直接已知子类:Inet