我在前面的博客中提到过如何获取各国IP地址段信息,得到原始信息后,我需要把它入库,这里我使用了MySQL数据库。
假设表名为"IP_RANGE","IPSTART"字段记录了某段IP的起始地址,"IPEND"记录了结束地址,"COUNTRY"为国家代码。
为了比较和查找IP地址段信息,我需要把IP转换为整数存储,幸好MySQL为我们提供了INET_ATON和INET_NTOA两个函数,前者把四节点段式IP地址转换为整数,后者把整数复原为点段式IP地址。INET_ATON函数转换后的结果是无符号整数,范围在0~2^32(0~4294967296)之间。不过为了把数据导出到ACCESS中去,我不得不把它变为有符号整数,对应Microsoft Access中的长整型(范围在-2^31~2^31-1,即-2147483648~2147483647),绞尽脑汁,求教高手手,我使用了一个IF表达式,代码如下:
SELECT
`IPSTART`,
`IPEND`,
`COUNTRY`,
IF((INET_ATON(`IP_RANGE`.`IPSTART`)<POW(2,31),INET_ATON(`IP_RANGE`.`IPSTART`),(INET_ATON(`IP_RANGE`.`IPSTART`) -POW(2,32))) AS `IP_START`,
IF((INET_ATON(`IP_RANGE`.`IPEND`)<POW(2,31),INET_ATON(`IP_RANGE`.`IPEND`),(INET_ATON(`IP_RANGE`.`IPEND`) -POW(2,32))) AS `IP_END`
FROM `IP_RANGE`
其中,两句IF表达式也可以这么写:
IF((INET_ATON(`IP_RANGE`.`IPSTART`) <= 2147483647),INET_ATON(`IP_RANGE`.`IPSTART`),(INET_ATON(`IP_RANGE`.`IPSTART`) - -(-(4294967296)))) AS IP_START,
IF((INET_ATON(`IP_RANGE`.`IP_END`) <= 2147483647),INET_ATON(`IP_RANGE`.`IP_END`),(INET_ATON(`IP_RANGE`.`IP_END`) - -(-(4294967296)))) AS IP_S
有意思的是,INET_ATON计算出来的结果减去4294967296时,连着使用了三个"-",如果使用一个的话,就会出错。
没有评论:
发表评论