我在前面的博客中提到过如何获取各国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时,连着使用了三个"-",如果使用一个的话,就会出错。
2009年2月25日星期三
2009年2月14日星期六
VIM与编码有关的设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vim7.2在windows下的编码设置。
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-8
"解决部分中文字符显示不完整
set ambiwidth=double
vim7.2在windows下的编码设置。
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-8
"解决部分中文字符显示不完整
set ambiwidth=double
订阅:
博文 (Atom)