继这个帖子我想查询IPv6地址范围。

在IPv4的我将能够确定由一个ISP,并利用这些整数值提供的开始和结束的IP地址作为范围界限快速搜索数据库,以查看是否在DB任何条目落入该范围内。

这将如何通过IPv6的会受到影响?将ISP的还是IPv6地址的范围内像他们现在怎么办?而且你会如何有效地搜索这些范围,如果你是存储在SQL Server数据库的IPv6地址作为两个BIGINT的?

有帮助吗?

解决方案

是不正确使用的IP地址(IPv4的既不,也不是IPv6)的范围。正确的方式组的IP地址的特定的“范围”是使用前缀(CIDR表示法)或掩模(作废,如果尝试使用非连续掩膜仅对IPv4中,和随之而来的精神错乱)。

有时你会使用IPv4的范围内看到有人(有时甚至是应用,家用路由器等),但是这仅仅是个错误的方式来做到这一点。

使用无类别域间路由(CIDR)你将有一个元组<地址,前缀>,其中地址是一个128位的无符号整数,前缀是一个很小的(0..128)的无符号整数。前缀通知地址的许多最显著位如何表示网络地址,而使其它128-前缀至少-显著位来表示该网络中特定的主机。

因此,例如,一个IPv6 “范围” 的2620:0:860:2 :: / 64(wikimedia.org)表示从2620的所有主机:0:860:2 ::高达2620:0:860 :2:FFFF:FFFF:FFFF:FFFF

您不应该使用两个“BIGINT” s到存储在数据库中这样的值,但使用任何本地表示在一列,除非你想使你的生活开发商的噩梦。如果你的DBMS不支持整数这个大的,除了更换你的DBMS,我建议使用固定大小的二进制数据列,16个字节长。

其他提示

使用与DBMS对IPv6地址的适当的支持不会是一个坏 理念。下面是PostgreSQL的一个例子,版本8.3:

mydb=> CREATE TABLE Networks (name TEXT, prefix INET);
CREATE TABLE
mydb=> INSERT INTO Networks VALUES ('Documentation', '2001:DB8::/32');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('ULA', 'FC00::/7');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('Orchid', '2001:10::/28');
INSERT 0 1

mydb=> SELECT * FROM Networks;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
 ULA           | fc00::/7
 Orchid        | 2001:10::/28
(3 rows)

mydb=> SELECT * FROM Networks WHERE '2001:DB8::dcaf:BAD' << prefix;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
(1 row)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top