检查IP地址范围

时间:2015-03-04 14:29:04

标签: sql ip

我尝试将IP设置为国家/地区查询。

最简单的方法是像这样进行查询:

select  Country
from    dbip
where   8 * power(255,3) +
        8 * power(255,2) + 
        8 * power(255,1) + 8
        between FromIPInt and  ToIPInt 

适用于小型Google的IP,但适用于更高的IP: 将表达式转换为数据类型int的算术溢出错误。

我可以用哪种方式计算它?

1 个答案:

答案 0 :(得分:2)

CAST是解决方案,但你确实把它放在了正确的位置:

select  Country
from    dbip
where   cast(255 as bigint) * power(255,3)
        +  255 * power(255,2)
        +  255 * power(255,1)
        +  255
        between FromIPInt and  ToIPInt 

如果您对整个计算进行CAST,则会发生错误 将表达式转换为数据类型int 的算术溢出错误:

select cast(255 * power(255,3) as bigint)    

但如果你投出第一个数字

则不行
select cast(255 as bigint) * power(255,3)

有关该问题的更多详细信息:https://msdn.microsoft.com/en-us/library/ms187745.aspx

  

大于2,147,483,647的整数常量将转换为十进制数据类型,而不是bigint数据类型。

     

SQL Server不会自动将其他整数数据类型(tinyint,smallint和int)提升为bigint。