从WMI返回的子网掩码在Postgresql中不被接受

用户_0

在库存软件中,我使用WMI从机器获取信息。
我的查询:

SELECT * FROM Win32_NetworkAdapterConfiguration

对于每台机器,我将ip地址保存在数据库中,IPAddressIPSubnet字段获取值对于某些服务器,对于bot ipv4和ipv6地址,一切正常。

在某些Windows 2008r2服务器上,我的Microsoft故障转移群集虚拟适配器接口存在问题。它有一个ipv6地址。美好的。但是作为子网掩码,它给了我字符串:64

当我尝试在我的postgresql函数中使用它时,出现错误:

ERROR: invalid input syntax for type inet: "64"

64是有效的ipv6子网掩码吗?
如果是,为什么postgresql不接受它?我该如何解决此问题?
如果没有,如何解决此问题?

涉及的版本:

  • Microsoft Windows Server 2008 R2企业SP1
  • PostgreSQL 9.3(在Linux上)
  • .net framework 4(但在这种情况下,我认为它是不友好的)
桑德·斯特凡(Sander Steffann)

/64是IPv6地址的有效子网掩码(从技术上来说,这是众所周知的前缀长度)。根据您的错误消息,问题在于您没有在inet字段中添加地址和子网掩码,而仅是前缀长度。

我感觉到您使用inet错误类型。一个inet字段在一个字段中包含地址和子网掩码(前缀长度)。您无需为地址和掩码创建单独的列。

但是,您必须将子网掩码转换为前缀长度。前缀长度是地址的二进制表示形式中从开始设置为1的连续位数。例如,255.255.255.0对应于前缀长度24:IPv4地址的每个部分为8位,而255对应于设置为1的8位。因此,您得到3x8 = 24。子网掩码255.255.128.0对应于前缀长度17等。

IPv6仅使用前缀长度(称为CIDR)表示法。对于IPv4,通常同时使用网络掩码和CIDR表示法,但是PostgreSQL仅支持CIDR表示法。没关系,因为使用起来要简单得多

CIDR表示法的工作方式是:先写地址,然后是斜杠,后跟前缀长度。所以,你将存储地址192.0.2.123与子网掩码255.255.255.0192.0.2.123/24在单一inet领域。前缀长度为IPv6的地址看起来像2001:db8:aaa:bbb::1/64

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章