1、下载:下载最新的ip数据库(QQ纯真IP数据库)
2、解压缩:解压缩数据库到文本文件(IP数据库.txt)
3、替换:用替换工具把文本文件中的:CZ88.NET 给换掉(如:未知地区)
文本的末尾可能有两三行空行说明该ip库的一些信息,最好把这删除
4、导入到数据库:新建Access数据库,导入数据,选择文本文件,自动出来导入向导
这里选择固定宽度来分割字符的方式(带分隔符、固定宽度),下一步,下一步
选择新建表的方式保存数据,下一步(提示输入每个的字段名等),
分别命名成:IPStar,IPEnd,AreaInfo(设置该字段的时候一定在高级选项中把
这个字段设置长点:如200),添加一个Id主键,完成。
5、用SQL来处理数据变成我们需要的数据:首先现导入数据到SQL中,这里相信到家都会了
为了数据看起来更顺畅,这里在查询分析器里用这样的语句:
update IPInfo set AreaInfo=replace(AreaInfo,\'未知地区\',\'\')
update IPInfo set AreaInfo=\'未知地区\' where AreaInfo=\'\'
6、转化Ip成数字类型:
网上有不少文章介绍的是利用程序来处理这个事情,不过测试过太耗时间,不大现实
更有有效的方式是通过sql查询分析器执行操作,不用几分钟的事情就搞定了。
首先先给表IPInfo加几个临时字段:
int类型:IPStar1,IPStar2,IPStar3,IPStar4,IPEnd1,IPEnd2,IPEnd3,IPEnd4
varchar(16)类型:IPStarNew,IPEndNew
语句如下:写得麻烦了点,肯定有更好的方法,不过暂时现实现下想要的东西
/*取IP的第一个*/
update IPInfo set
IPStar1=substring(IPStar,0,charindex(\'.\',IPStar)),
IPStarNew=substring(IPStar,charindex(\'.\',IPStar)+1,len(IPStar)),
IPEnd1=substring(IPEnd,0,charindex(\'.\',IPEnd)),
IPEndNew=substring(IPEnd,charindex(\'.\',IPEnd)+1,len(IPEnd))
/*取IP的第一个*/
/*取IP的第二个*/
update IPInfo set
IPStar2=substring(IPStarNew,0,charindex(\'.\',IPStarNew)),
IPStarNew=substring(IPStarNew,charindex(\'.\',IPStarNew)+1,len(IPStarNew)),
IPEnd2=substring(IPEndNew,0,charindex(\'.\',IPEndNew)),
IPEndNew=substring(IPEndNew,charindex(\'.\',IPEndNew)+1,len(IPEndNew))
/*取IP的第二个*/
/*取IP的第三个*/
update IPInfo set
IPStar3=substring(IPStarNew,0,charindex(\'.\',IPStarNew)),
IPStarNew=substring(IPStarNew,charindex(\'.\',IPStarNew)+1,len(IPStarNew)),
IPEnd3=substring(IPEndNew,0,charindex(\'.\',IPEndNew)),
IPEndNew=substring(IPEndNew,charindex(\'.\',IPEndNew)+1,len(IPEndNew))
/*取IP的第三个*/
/*取IP的第四个*/
update IPInfo set
IPStar4=substring(IPStarNew,charindex(\'.\',IPStarNew)+1,len(IPStarNew)),
IPStarNew=\'\',
IPEnd4=substring(IPEndNew,charindex(\'.\',IPEndNew)+1,len(IPEndNew)),
IPEndNew=\'\'
/*取IP的第四个*/
/*把IP转成数字类型*/
update IPInfo set
IPStar=256*256*256*IPStar1+256*256*IPStar2+256*IPStar3+IPStar4,
IPEnd=256*256*256*IPEnd1+256*256*IPEnd2+256*IPEnd3+IPEnd4
/*把IP转成数字类型*/
操作完之后再把刚刚添加的那几个临时字段删除
OK到这里位置就把IP纯真数据变成弄想要的可以用来查询的数据了
存储过程:
CREATE PROCEDURE [IPInfo_Load]
@UserIP bigint
AS
select AreaInfo from IPInfo where IPStar <=@UserIP and @UserIP<=IPEnd
GO
程序:
string IPArr="";
if (Request.ServerVariables["HTTP_VIA"] != null)
{
IPArr = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
else
{
IPArr = Request.ServerVariables["REMOTE_ADDR"].ToString();
}
string[] IPArr = Ipstr.Split(\'.\');
long UserIP = 256 * 256 * 256 * long.Parse(IPArr[0]) + 256 * 256 * long.Parse(IPArr[1]) + 256 * long.Parse(IPArr[2]) + long.Parse(IPArr[3]);
DataSet IPds = new Configs().GetIPInfo(UserIP);
if (IPds.Tables[0].Rows.Count > 0)
AreaInfo = IPds.Tables[0].Rows[0]["AreaInfo"].ToString();