我应该选择什么数据类型在SQL Server中存储IP地址?
通过选择正确的数据类型,可以很容易地按IP地址进行过滤吗?
我正在为数据库中的网络的各个方面建模.我们正在处理的一个更烦人的问题是创建子网范围,然后确定给定的IP集合是否在这些范围内.我们当前的模型通过以下列说明了IPv4和IPv6之间的差异:
[subnet_sk] [int] IDENTITY(1,1) NOT NULL,
[ipv6_network] [char](39) NULL,
[ipv6_broadcast] [char](39) NULL,
[ipv4_network] [char](15) NULL,
[ipv4_broadcast] [char](15) NULL,
[network_type] [char](4) NOT NULL
Run Code Online (Sandbox Code Playgroud)
上面的模式做了一些重要的假设,这些假设很重要.我们正在利用完全扩展的IP(192.168.001.001vs. 192.168.1.1)进行存储和比较.我们做出这个决定是因为围绕在SQL服务器中以数字方式存储IPv6地址的问题(bigints是无符号的,这意味着我们必须使用六列来表示IPv6).
给定此表模式,可以很容易地编写一个select语句来确定任一类型的IP是否在表中的范围之间:
select *
from subnet
where '1234:0000:0000:0000:fc12:00ab:0042:1050'
between ipv6_network
and ipv6_broadcast
-- or alternatively for IPv4
select *
from subnet
where '192.168.005.015'
between ipv4_network
and ipv4_broadcast
Run Code Online (Sandbox Code Playgroud)
更为困难的是,IP列表确定哪些IP位于子网范围之间.IP列表将由用户输入提供,不存储在数据库中.显然,对于存储在数据库中的数据,我可以进行类似的连接,如下例所示.
例如,用户可以提供1234:0000:0000:0000:fc12:00ab:0042:1050,192.168.001.001和192.168.1.1.我提出的唯一解决方案是使用表值函数来拆分 IP 列表并使用以下之间执行连接:
-- this only covers the IPv4 addresses from the …Run Code Online (Sandbox Code Playgroud) 我需要将我的IP列表排序.问题是我希望它们在第一部分中的值之后排序,然后在第二部分中排序,依此类推.
MYTABLE
DATA
20.1.2.1
100.1.1.1
20.1.10.1
80.8.8.8
Run Code Online (Sandbox Code Playgroud)
此代码不对IP进行正确排序
SELECT * FROM MYTABLE ORDER BY DATA
Run Code Online (Sandbox Code Playgroud)
我希望得到这样的东西:
20.1.2.1
20.1.10.1
80.8.8.8
100.1.1.1
Run Code Online (Sandbox Code Playgroud)
谁能帮我 ?