基于Mysql的IP处理函数inet_aton()与inet_ntoa()的深入分析

有个统计需求,需要对IP进行分类统计,Mysql提供了inet_aton()和inet_ntoa()函数进程处理。
具体可以查看官方手册

INET_ATON(expr)
给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。

mysql> select inet_ntoa(3507806248);
+-----------------------+
| inet_ntoa(3507806248) |
+-----------------------+
| 209.20.224.40         |
+-----------------------+
1 row in set (0.00 sec)

产生的数字总是按照网络字节顺序。如上面,数字按照 209×2563 + 207×2562 + 224×2561 + 40 ×2560 进行计算。我们来验算下:

mysql> select 209*POW(256,3)+207*POW(256,2)+224*POW(256,1)+40*POW(256,0);
+------------------------------------------------------------+
| 209*POW(256,3)+207*POW(256,2)+224*POW(256,1)+40*POW(256,0) |
+------------------------------------------------------------+
|                                                 3520061480 |
+------------------------------------------------------------+
1 row in set (0.02 sec)

INET_ATON() 也能理解短格式 IP 地址:

mysql> select inet_aton('127.0.0.1'),inet_aton('127.1');
+------------------------+--------------------+
| inet_aton('127.0.0.1') | inet_aton('127.1') |
+------------------------+--------------------+
|             2130706433 |         2130706433 |
+------------------------+--------------------+
1 row in set (0.00 sec)

可以理解成为中间2为地址默认为0。

注: 在存储由INET_ATON() 产生的值时,推荐你使用 INT UNSIGNED 列。假如你使用 (带符号) INT列, 则相应的第一个八位组大于127的IP 地址值会被截至 2147483647 (即, INET_ATON('127.255.255.255′) 所返回的值)。当然,直接使用bigint更加省事。

INET_NTOA(expr)
给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的电地址表示。也就是inet_aton()的反函数。

mysql> select inet_ntoa(3507806248);
+-----------------------+
| inet_ntoa(3507806248) |
+-----------------------+
| 209.20.224.40         |
+-----------------------+
1 row in set (0.00 sec)

(0)

相关推荐

  • 基于Mysql的IP处理函数inet_aton()与inet_ntoa()的深入分析

    有个统计需求,需要对IP进行分类统计,Mysql提供了inet_aton()和inet_ntoa()函数进程处理.具体可以查看官方手册. INET_ATON(expr)给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> select inet_ntoa(3507806248);+-----------------------+| inet_ntoa(3507806248) |+-----------------------+| 209

  • IP处理函数inet_aton()和inet_ntoa()使用说明

    MYSql的IP对int的转换函数 select inet_aton(ip) from table_name; 网络地址: 192.168.33.123 每一个值最大不会越过255,也就是十六进制的FF,两个Byte刚好表示的最大值是255, 这样子,就可以用一个32位的整形来保存这个地址 192 168 33 123 1100 0000 1010 1000 0010 0001 0111 1011 把这些二进制合在一起就是32位的数了 110000001010100000100001011110

  • PHP基于ip2long实现IP转换整形

    如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如 <?php echo ip2long("10.2.1.3"); ?> 我们将得到 167903491 这是如何计算的,目前我知道有两个算法.其一 <?php function ip2int($ip){ //我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4 list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip)

  • 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法分享

    mysql> create table jackbillow (ip int unsigned, name char(1)); Query OK, 0 rows affected (0.02 sec) mysql> insert into jackbillow values(inet_aton('192.168.1.200'), 'A'), (inet_aton('200.100.30.241'), 'B'); Query OK, 2 rows affected (0.00 sec) Reco

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

    本文将介绍如何在数据库中使用合适格式保存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

  • MySQL存储IP地址的方法

    为什么要问如何存储IP? 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升. 利用函数算法处理 在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少空间.因为varchar是可变长形

  • PHP中基于perl的正则表达式处理函数

    前面我们已经学习了正则表达式的基础语法,包括了定界符.原子.元字符和模式修正 符.实际上正则表达式想要起作用的话,就必须借用正则表达式处理函数.本节我们就来介绍一下PHP中基于perl的正则表达式处理函数,主要包含了分割, 匹配,查找,替换等等处理操作,依旧是配合示例讲解,让我们开始吧. 和正则表达式一样,正则表达式处理函数不能够独立使用,而这必须相结合,才能够完成特定的功能.在前面我们也说过,基于perl的正则表达式要快于POXIS正则表达式处理函数,所以我们只介绍以preg开头的基于perl

  • PHP基于新浪IP库获取IP详细地址的方法

    本文实例讲述了PHP基于新浪IP库获取IP详细地址的方法.分享给大家供大家参考,具体如下: <?php class Tool{ /** * 获取IP的归属地( 新浪IP库 ) * * @param $ip String IP地址:112.65.102.16 * @return Array */ static public function getIpCity($ip) { $ip = preg_replace("/\s/","",preg_replace(&q

  • 基于Mysql的Sequence实现方法

    团队更换新框架.新的业务全部使用新的框架,甚至是新的数据库--Mysql. 这边之前一直是使用oracle,各种订单号.流水号.批次号啥的,都是直接使用oracle的sequence提供的数字序列号.现在数据库更换成Mysql了,显然以前的老方法不能适用了. 需要新写一个: •分布式场景使用 •满足一定的并发要求 找了一些相关的资料,发现mysql这方面的实现,原理都是一条数据库记录,不断update它的值.然后大部分的实现方案,都用到了函数. 贴一下网上的代码: 基于mysql函数实现 表结构

  • 基于MySql的扩展功能生成全局ID

    本文利用 MySQL的扩展功能 REPLACE INTO 来生成全局id,REPLACE INTO和INSERT的功能一样,但是当使用REPLACE INTO插入新数据行时,如果新插入的行的主键或唯一键(UNIQUE Key)已有的行重复时,已有的行会先被删除,然后再将新数据行插入(REPLACE INTO 是原始操作). 建立类似下面的表: CREATE TABLE `tickets64` ( `id` bigint(20) unsigned NOT NULL auto_increment,

随机推荐