当前位置: 移动技术网 > IT编程>数据库>Mysql > IP处理函数inet_aton()和inet_ntoa()使用说明

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

wenxin,凌成兴的侄女,大登殿

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网