珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

时间:2022-04-08 19:08:54
在幻想曲BLOG上看到不少朋友说,最近服务器上的IP数据好像不是很准确,于是重新做了一个新的,不少朋友可能需要这个数据库,因为文件太大的缘故,所以直接提供快速转换方法。

首先需要准备:

  • 最新的珊瑚虫IP数据库 http://update.cz88.net/soft/qqwry.rar
  • Microsoft Office Access 2003
  • EiditPlus
  • MS SQL2005


1.然后打开珊瑚虫IP数据库自带的 ShowIP.exe,选择解压,另存一个TXT文件:
珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

2.用EiditPlus打开这个文本拖动到最后几行,删除多余的东西(千万别试图用默认的文本编辑器打开,内存小的话你会死的很惨):
珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

3.打开Access(为什么不直接到SQL里面导入数据呢?因为会出现文本格式错误,所以先曲线救国吧):
珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

4.选择刚才解压出来的文本文件:
珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

5.按下面操作,不做提示的直接下一步:
珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

7.打开MS SQL2005,新建一个数据库,名字自己定,以下代码都使用[BasName]代替你新建数据库名称。

8.继续如下操作:
珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

完成执行下面的存储过程:
--  建立IP转换到十进制方法
USE  [ BasName ]
GO
/* ***** 对象:  UserDefinedFunction [dbo].[X16ToDe]    脚本日期: 09/19/2007 13:56:15 ***** */
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO

--  =============================================
--
 Author:        <Author,,Name>
--
 Create date: <Create Date, ,>
--
 Description:    转换IP为十进制
--
 =============================================
Create  FUNCTION  [ dbo ] . [ X16ToDe ]
(
    
@Old_IP  nvarchar ( 15 )
)
RETURNS  numeric
AS
BEGIN
    
DECLARE
        
@CharIndex  INT ,
        
@CurrPoint  INT ,
        
@SingleValue  NVARCHAR ( 5 ),
        
@Cache  numeric

    
SET  @CharIndex  =  1
    
SET  @CurrPoint  =  CHARINDEX ( ' . ' , @Old_IP , @CharIndex )
    
SET  @SingleValue  =  SUBSTRING ( @Old_IP , @CharIndex , @CurrPoint  -  @CharIndex )
    
SET  @Cache  =  cast ( @SingleValue  as  numeric) * 16777216

    
SET  @CharIndex  =  @CurrPoint  +  1
    
SET  @CurrPoint  =  CHARINDEX ( ' . ' , @Old_IP , @CharIndex )
    
SET  @SingleValue  =  SUBSTRING ( @Old_IP , @CharIndex , @CurrPoint  -  @CharIndex )
    
SET  @Cache  =  @Cache  +  cast ( @SingleValue  as  numeric) * 65536

    
SET  @CharIndex  =  @CurrPoint  +  1
    
SET  @CurrPoint  =  CHARINDEX ( ' . ' , @Old_IP , @CharIndex )
    
SET  @SingleValue  =  SUBSTRING ( @Old_IP , @CharIndex , @CurrPoint  -  @CharIndex )
    
SET  @Cache  =  @Cache  +  cast ( @SingleValue  as  numeric) * 256

    
SET  @CharIndex  =  @CurrPoint  +  1
    
SET  @SingleValue  =  SUBSTRING ( @Old_IP , @CharIndex , len ( @Old_IP ) -  @CharIndex  +  1 )
    
SET  @Cache  =  @Cache  +  cast ( @SingleValue  as  numeric)
    
    
RETURN  @Cache ;
END

这一步你可以自己按照你的情况来做,我是为了加快数据库索引的速度,所以将IP全部转换为十进制,存到一个新表里面。
--  建立十进制新表
USE  [ BasName ]
GO
/* ***** 对象:  Table [dbo].[IP_Real]    脚本日期: 09/19/2007 14:01:31 ***** */
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
Create  TABLE  [ dbo ] . [ IP_Real ] (
    
[ startip ]  [ numeric ] ( 18 0 NULL ,
    
[ endip ]  [ numeric ] ( 18 0 NULL ,
    
[ country ]  [ nvarchar ] ( 50 NULL ,
    
[ local ]  [ nvarchar ] ( 200 NULL
ON  [ PRIMARY ]


--  格式化省份
Update  [ BasName ] . [ dbo ] . [ IP ]
   
SET  [ country ]  =  replace ( [ country ] ,N ' ' ,N ' 省  ' )

--  删除CZ88.NET
Update  [ BasName ] . [ dbo ] . [ IP ]
   
SET  [ country ]  =  replace ( [ country ] ,N ' CZ88.NET ' ,N '' )

--  将地区提出
Update  [ BasName ] . [ dbo ] . [ IP ]
   
SET  [ local ]  =  SUBSTRING ( [ country ] , CHARINDEX ( '  ' , [ country ] , 1 ) + 1 , len ( [ country ] ))

--  存为国家或省份
Update  [ BasName ] . [ dbo ] . [ IP ]
   
SET  [ country ]  =  SUBSTRING ( [ country ] , 0 , CHARINDEX ( '  ' , [ country ] , 1 ))

--  去处前后导空格
Update  [ BasName ] . [ dbo ] . [ IP ]
   
SET  [ country ]  =  Rtrim ( Ltrim ( [ country ] ))
      ,
[ local ]  =  Rtrim ( Ltrim ( [ local ] ))

--  转换IP为十进制,并写入新表
Insert  INTO  [ BasName ] . [ dbo ] . [ IP_Real ]
           (
[ startip ]
           ,
[ endip ]
           ,
[ country ]
           ,
[ local ] )
Select  dbo.X16ToDe( [ startip ] )
      ,dbo.X16ToDe(
[ endip ] )
      ,
[ country ]
      ,
[ local ]
  
FROM  [ BasName ] . [ dbo ] . [ IP ]
order  by  [ startip ]  ASC
最后测试一下看看:
--  测试
DECLARE  @IPNumber  numeric
set  @IPNumber  =  dbo.X16ToDe( ' 219.140.31.91 ' )

Select  [ startip ]
      ,
[ endip ]
      ,
[ country ]
      ,
[ local ]
  
FROM  [ BasName ] . [ dbo ] . [ IP_Real ]
Where  [ startip ]  <=  @IPNumber  and  [ endip ]  >=  @IPNumber