在SQL Server中存储IP地址的数据类型

129

我应该在SQL Server中选择什么数据类型来存储IP地址?

通过选择正确的数据类型,过滤IP地址会变得容易吗?


请看这个答案:https://dev59.com/iHNA5IYBdhLWcg3wPbSe - Mark Redman
12个回答

0

我们经常需要处理需要确定哪些IP在特定子网中的工作。我发现最简单和最可靠的方法是:

  1. 为每个表添加一个名为IPInteger(bigint)的字段(无效时,将IP设置为“0.0.0.0”)
  2. 对于较小的表,我使用触发器在更改时更新IPInteger
  3. 对于较大的表,我使用SPROC刷新IPIntegers
    ALTER FUNCTION [dbo].[IP_To_INT ]
    ( 
        @IP CHAR(15) 
    ) 
    RETURNS BIGINT 
    AS 
    BEGIN 
        DECLARE @IntAns BIGINT, 
            @block1 BIGINT, 
            @block2 BIGINT, 
            @block3 BIGINT, 
            @block4 BIGINT, 
            @base BIGINT 
     
        SELECT 
            @block1 = CONVERT(BIGINT, PARSENAME(@IP, 4)), 
            @block2 = CONVERT(BIGINT, PARSENAME(@IP, 3)), 
            @block3 = CONVERT(BIGINT, PARSENAME(@IP, 2)), 
            @block4 = CONVERT(BIGINT, PARSENAME(@IP, 1)) 
     
        IF (@block1 BETWEEN 0 AND 255) 
            AND (@block2 BETWEEN 0 AND 255) 
            AND (@block3 BETWEEN 0 AND 255) 
            AND (@block4 BETWEEN 0 AND 255) 
        BEGIN      
            SET @base = CONVERT(BIGINT, @block1 * 16777216)
            SET @IntAns = @base +  
                (@block2 * 65536) +  
                (@block3 * 256) + 
                (@block4) 
        END 
        ELSE 
            SET @IntAns = -1 
        RETURN @IntAns 
    END

我认为 bigint 不能存储所有的IPv6地址,因为它只有8个字节,而IPv6协议需要16个字节。 - cdimitroulas

-3

我目前正在使用 varchar(15),一切都在正常工作。插入、更新、选择。我刚刚开始开发一个涉及 IP 地址的应用程序,尽管我还没有做太多的开发工作。

以下是选择语句:

select * From dbo.Server 
where  [IP] = ('132.46.151.181')
Go

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接