↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

9.12. 网络地址函数和操作符 #

IP 网络地址类型,cidr 和 inet,支持表 9.1 所示的常用比较操作符,以及表 9.38 和表 9.39 所示的专用操作符和函数。

任何 cidr 值都可以隐式地转换到 inet;因此,下面在 inet 上操作的操作符和函数也可以在 cidr 值上工作。(如果 inet 和 cidr 各有单独的函数,是因为这两种情况下的行为应当不同。)此外,也允许将 inet 值转换为 cidr。当这样做的时候,子网掩码右边的任何位都被静默地置零,以创建一个有效的 cidr 值。

表 9.38. IP 地址操作符

操作符

描述

示例

inet << inet → boolean

子网是否严格包含在另一个子网中?这个操作符和后续四个操作符测试子网包含关系。它们只考虑两个地址的网络部分(忽略网络掩码右侧的所有位),并判断一个网络是否与另一个网络相同,或是另一个网络的子网。

inet '192.168.1.5' << inet '192.168.1/24' → t

inet '192.168.0.5' << inet '192.168.1/24' → f

inet '192.168.1/24' << inet '192.168.1/24' → f

inet <<= inet → boolean

子网是否被包含于或等于子网?

inet '192.168.1/24' <<= inet '192.168.1/24' → t

inet >> inet → boolean

子网是否严格包含子网?

inet '192.168.1/24' >> inet '192.168.1.5' → t

inet >>= inet → boolean

子网是否包含或等于子网?

inet '192.168.1/24' >>= inet '192.168.1/24' → t

inet && inet → boolean

其中一个子网包含或等于另一个子网?

inet '192.168.1/24' && inet '192.168.1.80/28' → t

inet '192.168.1/24' && inet '192.168.2.0/28' → f

~ inet → inet

计算按位非。

~ inet '192.168.1.6' → 63.87.254.249

inet & inet → inet

计算按位与。

inet '192.168.1.6' & inet '0.0.0.255' → 0.0.0.6

inet | inet → inet

计算按位或。

inet '192.168.1.6' | inet '0.0.0.255' → 192.168.1.255

inet + bigint → inet

向地址添加偏移量。

inet '192.168.1.6' + 25 → 192.168.1.31

bigint + inet → inet

向地址添加偏移量。

200 + inet '::ffff:fff0:1' → ::ffff:255.240.0.201

inet - bigint → inet

从地址中减去偏移量。

inet '192.168.1.43' - 36 → 192.168.1.7

inet - inet → bigint

计算两个地址的差值。

inet '192.168.1.43' - inet '192.168.1.19' → 24

inet '::1' - inet '::ffff:1' → -4294901760


表 9.39. IP 地址的函数

函数

描述

示例

abbrev ( inet ) → text

创建文本形式的缩写显示格式。(结果与 inet 输出函数产生的结果相同;只有与显式类型转换为 text 的结果相比时,才称为“缩写形式”。由于历史原因,后一种转换从不省略网络掩码部分。)

abbrev(inet '10.1.0.0/32') → 10.1.0.0

abbrev ( cidr ) → text

创建文本形式的缩写显示格式。(缩写形式会省略网络掩码右侧值为零的字节;更多示例见表 8.22。)

abbrev(cidr '10.1.0.0/16') → 10.1/16

broadcast ( inet ) → inet

为地址的网络计算广播地址。

broadcast(inet '192.168.1.5/24') → 192.168.1.255/24

family ( inet ) → integer

返回地址的地址族:4 对应 IPv4,6 对应 IPv6。

family(inet '::1') → 6

host ( inet ) → text

返回 IP 地址文本,忽略子网掩码。

host(inet '192.168.1.0/24') → 192.168.1.0

hostmask ( inet ) → inet

为地址的网络计算主机掩码。

hostmask(inet '192.168.23.20/30') → 0.0.0.3

inet_merge ( inet, inet ) → cidr

计算包含两个给定网络的最小网络。

inet_merge(inet '192.168.1.5/24', inet '192.168.2.5/24') → 192.168.0.0/22

inet_same_family ( inet, inet ) → boolean

测试地址是否属于同一 IP 族。

inet_same_family(inet '192.168.1.5/24', inet '::1') → f

masklen ( inet ) → integer

返回子网掩码长度,以位为单位。

masklen(inet '192.168.1.5/24') → 24

netmask ( inet ) → inet

为地址的网络计算网络掩码。

netmask(inet '192.168.1.5/24') → 255.255.255.0

network ( inet ) → cidr

返回地址的网络部分,将子网掩码右边的部分归零。(这相当于将值转换为 cidr。)

network(inet '192.168.1.5/24') → 192.168.1.0/24

set_masklen ( inet, integer ) → inet

设置 inet 值的子网掩码长度。地址部分不改变。

set_masklen(inet '192.168.1.5/24', 16) → 192.168.1.5/16

set_masklen ( cidr, integer ) → cidr

设置 cidr 值的子网掩码长度。新子网掩码右侧的地址位设置为零。

set_masklen(cidr '192.168.1.0/24', 16) → 192.168.0.0/16

text ( inet ) → text

以文本形式返回未缩写的 IP 地址和子网掩码长度。(这与显式转换为 text 的结果相同。)

text(inet '192.168.1.5') → 192.168.1.5/32


提示

abbrev、host 和 text 函数主要用于为 IP 地址提供另一种显示格式。

MAC 地址类型,macaddr 和 macaddr8,支持表 9.1 中所示的常用比较操作符以及表 9.40 中所示的特殊函数。此外,它们支持按位逻辑操作符~、& 和|(非、与和或),就像上面对 IP 地址所示的那样。

表 9.40. MAC 地址函数

函数

描述

示例

trunc ( macaddr ) → macaddr

将地址的最后 3 个字节设置为零。其余的前缀可以与特定的制造商关联(使用 PostgreSQL 中没有包含的数据)。

trunc(macaddr '12:34:56:78:90:ab') → 12:34:56:00:00:00

trunc ( macaddr8 ) → macaddr8

将地址的最后 5 个字节设置为零。其余的前缀可以与特定的制造商关联(使用 PostgreSQL 中没有包含的数据)。

trunc(macaddr8 '12:34:56:78:90:ab:cd:ef') → 12:34:56:00:00:00:00:00

macaddr8_set7bit ( macaddr8 ) → macaddr8

将地址的第 7 位设置为 1,生成所谓的修订 EUI-64 格式,以便用于 IPv6 地址。

macaddr8_set7bit(macaddr8 '00:34:56:ab:cd:ef') → 02:34:56:ff:fe:ab:cd:ef


报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.