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
  • 相关阅读:
    互动留言赠书:《Oracle高性能系统实战大全》
    超融合硬件损坏导致Oracle RAC异常恢复实录
    架构师不得不了解的硬件知识
    加班做的可视化被老板嫌弃,是因为你不会用这些数据工具
    iOS开发之七:常用控件--UISlider、UISegmentedControl、UIPageControl的使用
    iOS开发之六:常用控件--UIImageView的使用
    iOS开发之五:常用控件--UITextField的使用
    Objective-C实现常用的4种排序算法
    C语言实现4种常用排序
    面试常用的4种数组排序
  • 原文地址:https://www.cnblogs.com/top5/p/1589905.html
Copyright © 2011-2022 走看看