在幻想曲BLOG上看到不少朋友說,最近服務(wù)器上的IP數(shù)據(jù)好像不是很準(zhǔn)確,于是重新做了一個新的,不少朋友可能需要這個數(shù)據(jù)庫,因為文件太大的緣故,所以直接提供快速轉(zhuǎn)換方法。
首先需要準(zhǔn)備:
- 最新的珊瑚蟲IP數(shù)據(jù)庫 http://update.cz88.net/soft/qqwry.rar
- Microsoft Office Access 2003
- EiditPlus
- MS SQL2005
1.然后打開珊瑚蟲IP數(shù)據(jù)庫自帶的 ShowIP.exe,選擇解壓,另存一個TXT文件:
2.用EiditPlus打開這個文本拖動到最后幾行,刪除多余的東西(千萬別試圖用默認(rèn)的文本編輯器打開,內(nèi)存小的話你會死的很慘):
3.打開Access(為什么不直接到SQL里面導(dǎo)入數(shù)據(jù)呢?因為會出現(xiàn)文本格式錯誤,所以先曲線救國吧):
4.選擇剛才解壓出來的文本文件:
5.按下面操作,不做提示的直接下一步:
7.打開MS SQL2005,新建一個數(shù)據(jù)庫,名字自己定,以下代碼都使用[BasName]代替你新建數(shù)據(jù)庫名稱。
8.繼續(xù)如下操作:
完成執(zhí)行下面的存儲過程:
-- 建立IP轉(zhuǎn)換到十進(jìn)制方法
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: 轉(zhuǎn)換IP為十進(jìn)制
-- =============================================
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
這一步你可以自己按照你的情況來做,我是為了加快數(shù)據(jù)庫索引的速度,所以將IP全部轉(zhuǎn)換為十進(jìn)制,存到一個新表里面。
-- 建立十進(jìn)制新表
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'')
-- 將地區(qū)提出
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))
-- 去處前后導(dǎo)空格
Update [BasName].[dbo].[IP]
SET [country] = Rtrim(Ltrim([country]))
,[local] = Rtrim(Ltrim([local]))
-- 轉(zhuǎn)換IP為十進(jìn)制,并寫入新表
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
Tag標(biāo)簽: 珊瑚蟲IP,數(shù)據(jù)庫,SQL2000,SQL2005,純真IP,sql