继这篇文章之后,我对搜索IPv6地址范围感兴趣。
在IPv4下,我可以确定ISP提供的起始和结束IP地址,并使用这些整数值作为范围边界快速搜索数据库,以查看数据库中是否有任何条目落入该范围内。
IPv6会受到什么影响? ISP是否仍将拥有类似现在的IPv6地址范围?如果您将IPv6地址存储为SQL Server DB中的两个bigint,则如何有效地搜索这些范围?
如果您想将这样的值存储在数据库中,不应该使用两个“bigint”,而应该使用任何本地表示在单个列中,除非您想让开发人员的生活变成一场噩梦。如果您的DBMS不支持如此大的整数,除了替换您的DBMS外,我建议使用一个固定大小的二进制数据列,长度为16字节。
使用支持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)