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位的数了
11000000101010000010000101111011
十进制为
3232244091
* INET_ATON(expr)
给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480
产生的数字总是按照网络字节顺序。如上面的例子,数字按照 209×2^24 + 207×2^16 + 224×2^8 + 40 进行计算。
INET_ATON() 也能理解短格式 IP 地址:

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
-> 2130706433, 2130706433
注释: 在存储由INET_ATON() 产生的值时,推荐你使用 INT UNSIGNED 列。假如你使用 (带符号) INT列, 则相应的第一个八位组大于127的IP 地址值会被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)。请参见11.2节,“数值类型”。
* INET_NTOA(expr)
给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的电地址表示。
mysql> SELECT INET_NTOA(3520061480);

-> '209.207.224.40'

在做项目时,并不知道这两个函数,所以对IP的处理都是自己写的函数,但是使用时效率却是十分的差,下面函数是把IP转化成整数:


代码如下:

CREATE FUNCTION `transIPtoInt`(ip char(31)) RETURNS char(31)
begin
DECLARE value1 CHAR(10);
DECLARE value2 CHAR(10);
DECLARE value3 CHAR(10);
DECLARE value4 CHAR(10);
set value1=SUBSTRING_INDEX(ip, '.', 1);
set value2=SUBSTRING_INDEX(ip, '.', 2);
set value2=SUBSTRING_INDEX(value2, '.', -1);
set value3=SUBSTRING_INDEX(ip, '.', -2);
set value3=SUBSTRING_INDEX(value3, '.', 1);
set value4=SUBSTRING_INDEX(ip, '.', -1);
set value1=value1<<24;
set value2=value2<<16;
set value3=value3<<8;
return value1+value2+value3+value4;
end;

为了IP地址比较的方便,我还写了一个把IP地址中每一段都补足三位的函数,如下:


代码如下:

CREATE FUNCTION `fillIp`(ip char(31)) RETURNS char(31)
begin
DECLARE value1 CHAR(31);
DECLARE value2 CHAR(10);
DECLARE value3 CHAR(10);
DECLARE value4 CHAR(10);
set value1=SUBSTRING_INDEX(ip, '.', 1);
set value2=SUBSTRING_INDEX(ip, '.', 2);
set value2=SUBSTRING_INDEX(value2, '.', -1);
set value3=SUBSTRING_INDEX(ip, '.', -2);
set value3=SUBSTRING_INDEX(value3, '.', 1);
set value4=SUBSTRING_INDEX(ip, '.', -1);
set value1=LPAD(value1,3,'0');
set value2=LPAD(value2,3,'0');
set value3=LPAD(value3,3,'0');
set value4=LPAD(value4,3,'0');
return CONCAT(value1,'.',value2,'.',value3,'.',value4);
end;

以下是一些补充
* INET_ATON(expr)
给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480
产生的数字总是按照网络字节顺序。如上面的例子,数字按照 209×2563 + 207×2562 + 224×256 + 40 进行计算。
INET_ATON() 也能理解短格式 IP 地址:
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
-> 2130706433, 2130706433
注释: 在存储由INET_ATON() 产生的值时,推荐你使用 INT UNSIGNED 列。假如你使用 (带符号) INT列, 则相应的第一个八位组大于127的IP 地址值会被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)。请参见MySQL文档中的“数值类型”。
* INET_NTOA(expr)
给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的电地址表示。
*
mysql> SELECT INET_NTOA(3520061480);
-> '209.207.224.40'

--------------------------------------------------------------------------------------------------

整型字段的比较比字符串效率高很多,这也符合一项优化原则:字段类型定义使用最合适(最小),最简单的数据类型。
inet_aton()算法,其实借用了国际上对各国IP地址的区分中使用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。

--------------------------------------------------------------------------------------------------

利用mysql的内置函数处理时间戳问题
eg : select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x');
结果: 2004 3rd August 03:35:48 2004

(0)

相关推荐

  • 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的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

  • 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

  • 基于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

  • asp下取得客户端IP地址函数 转换IP地址函数

    <% '****************************** '函数:Userip() '参数:无 '作者:阿里西西 '日期:2007/7/12 '描述:取得客户端IP地址 '示例:<%=Userip()%> '****************************** Function Userip() Dim GetClientIP '如果客户端用了代理服务器,则应该用ServerVariables("HTTP_X_FORWARDED_FOR")方法 G

  • asp下实现IP限制函数代码

    IP限制函数 大家如果还有好的建议算法,就联系我!!:) "****************************** "Function CheckIp(cInput_Ip,cBound_Ip) "Created by qqdao, qqdao@263.net 2001/11/28 "说明:首先需要根据;号循环,然后判断是否含有"-",如果有则进行拆分处理,最后判断是否在范围内 "参数: cInput_Ip,代检查的ip "

  • asp.net(vb.net)获取真实IP的函数

    aspx vb.net获取真实IP的函数如下: 复制代码 代码如下: <script runat="server"> Public Function CheckIp(ByVal ip As String) As Boolean Dim pat As String = "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$" Dim reg As Regex = New Regex(pat) if ip = "

  • php gethostbyname获取域名ip地址函数详解

    返回 IP 网址. gethostbyname语法: string gethostbyname(string hostname); gethostbyname返回值: 字符串 函数种类: 网络系统 gethostbyname内容说明 本函数可返回某个机器名称 (Domain Name) 的 IP 网址 (IP Address).若执行失败,则返回原来的机器名称. 使用范例 下例的gethostbyname返回值为 61.129.70.67 <? echo gethostbyaddr("ww

  • 做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)

    asp函数代码: 复制代码 代码如下: function checkip(checkstring)'用正则判断IP是否合法dim re1set re1=new RegExpre1.pattern="^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"re1.global=falsere1.Ignorecase=falsecheckip=re1.test(checkstring)set re1=nothingend function functio

  • ASP中实现限制IP的函数详解

    '****************************** 'Function CheckIp(cInput_Ip,cBound_Ip) 'Created by qqdao, qqdao@263.net 2001/11/28 '说明:首先需要根据;号循环,然后判断是否含有"-",如果有则进行拆分处理,最后判断是否在范围内 '参数: cInput_Ip,代检查的ip 'cBound_Ip,给定的范围格式为,单个ip,和范围ip,范围ip最后使用"-"分割,如果是&

随机推荐