加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SQL语句查询IP段的方法

(2013-11-16 20:23:34)
标签:

sql

查询

ip

it

分类: 软件开发
数据库中有一个IP_talbe表,存储IP段和相对应的地址,里面有三列,分别是
IPstart, IPend, address.
在网页中获取用户的IP地址,然后在数据库中查询该用户所属的address;


这种数据结构的话,应该先把IP地址转换成数值,才能用 数值 比较查询。



IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。
IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。
例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。
如果我们把ip地址看成 a.b.c.d,那么转成IP数值就是 d*2的0次方 + c*2的8次方 + b*2的16次方 + a*2的24次方


为了实现IP 字符串转换成数值,要建一个字符串IP地址转换成IP数值函数。

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_IP2Int]') and xtype in (N'FN', N'IF', N'TF'))

drop function [dbo].[f_IP2Int]

GO

CREATE FUNCTION dbo.f_IP2Int(

@ip char(15)

)RETURNS bigint

AS

BEGIN

    DECLARE @re bigint

    SET @re=0

    SELECT @re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID

        ,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'')

    FROM(

        SELECT ID=CAST(16777216 as bigint)

        UNION ALL SELECT 65536

        UNION ALL SELECT 256

        UNION ALL SELECT 1)a

    RETURN(@re)

END

GO

查询语句中就可以用这个函数了

select address 

from IP_table 

where dbo.f_ip2int(IP) beween dbo.f_ip2int(IPstart) and dbo.f_ip2int(IPend)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有