我使用的是 postgres 9.5,我想知道 postgres 是否允许对 IP 地址进行任何类型的子网划分或计算,特别是 IPv6。我知道他们有存储数据的cidr格式,如 IpV4 和 Ipv6 格式。但是,我可以做任何事情,例如找出存储在数据库中的子网中有多少个客户端 IP?
例如。如果我存储了 的 IPv6 地址2001:dd8::/64,我能否找出有多少主机 IP(根据某些计算器,为 18446744073709551616)。
我的猜测是答案是否定的,postgres 不支持这一点。
作为3manuek提到的,还有是功能和运营商应对IP地址-无论是IPv4或IPv6。
我有点想知道你的号码是从哪里来的。您提供的地址范围转换为
2001:0dd8:0000:0000:0000:0000:0000:0000
Run Code Online (Sandbox Code Playgroud)
这是一个长度为 1 的地址范围。
如果您的意思是所有可能的地址都以 '2001:dd8:' 开头,那么该范围的正确名称应该是2001:dd8::/32,因为它是给出的前 32 位。根据计算器工具,结果范围如下:
Start Range: 2001:dd8:0:0:0:0:0:0
End Range: 2001:dd8:ffff:ffff:ffff:ffff:ffff:ffff
No. of host: 79228162514264337593543950336
Run Code Online (Sandbox Code Playgroud)
同时,如果您省略块大小 ( /32),您将获得一个地址(我在上面显示的地址)。
因此,有一种方法可以使用内置的 PostgreSQL 功能来获取计算器提供的数字。我们这里的朋友是masklen():
SELECT round(2 ^ (128 - masklen('2001:dd8::/32'::cidr))::numeric);
round
???????????????????????????????
79228162514264337593543950336
Run Code Online (Sandbox Code Playgroud)
结果与计算器的形式相同。四舍五入是为了去除小数点和小数点后面的零,这是转换为 的结果numeric。
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |