zoukankan      html  css  js  c++  java
  • 珊瑚虫IP数据库转 SQL 2005 纯真IP转sql

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

    首先需要准备:

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


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


    2.用EiditPlus打开这个文本拖动到最后几行,删除多余的东西(千万别试图用默认的文本编辑器打开,内存小的话你会死的很惨):


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


    4.选择刚才解压出来的文本文件:


    5.按下面操作,不做提示的直接下一步:






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

    8.继续如下操作:




    完成执行下面的存储过程:
    -- 建立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](180NULL,
        
    [endip] [numeric](180NULL,
        
    [country] [nvarchar](50NULL,
        
    [local] [nvarchar](200NULL
    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
  • 相关阅读:
    [转]Windows管道系统
    [转]TCP连接的状态与关闭方式,及其对Server与Client的影响
    CreateProcess启动进程后,最好CloseHandle(pi.hProcess);CloseHandle(pi.hThread);
    [转]VC++ 通过进程名或进程ID获取进程句柄
    [装]解决sqlite3插入数据很慢的问题
    SublimeText3搭建go语言开发环境(windows)
    [转]完成端口(CompletionPort)详解 手把手教你玩转网络编程系列之三
    go语言疑问
    css中marginleft与left的区别
    jsp分页显示的代码与详细步骤
  • 原文地址:https://www.cnblogs.com/top5/p/1589905.html
Copyright © 2011-2022 走看看