当前位置:七道奇文章资讯数据防范MySQL防范
日期:2012-06-02 15:08:00  来源:本站整理

IP处理函数inet_aton()和inet_ntoa()利用阐明[MySQL防范]

赞助商链接



  本文“IP处理函数inet_aton()和inet_ntoa()利用阐明[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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   以上是“IP处理函数inet_aton()和inet_ntoa()利用阐明[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • IP处理函数inet_aton()和inet_ntoa()利用阐明
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .