在库存软件中,我使用WMI从机器获取信息。
我的查询:
SELECT * FROM Win32_NetworkAdapterConfiguration
对于每台机器,我将ip地址保存在数据库中,并从IPAddress和IPSubnet字段获取值。对于某些服务器,对于bot ipv4和ipv6地址,一切正常。
在某些Windows 2008r2服务器上,我的Microsoft故障转移群集虚拟适配器接口存在问题。它有一个ipv6地址。美好的。但是作为子网掩码,它给了我字符串:64
当我尝试在我的postgresql函数中使用它时,出现错误:
ERROR: invalid input syntax for type inet: "64"
64是有效的ipv6子网掩码吗?
如果是,为什么postgresql不接受它?我该如何解决此问题?
如果没有,如何解决此问题?
涉及的版本:
/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.0
为192.0.2.123/24
在单一inet
领域。前缀长度为IPv6的地址看起来像2001:db8:aaa:bbb::1/64
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句