PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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

IP 网络地址类型 cidr 和 inet 支持 Table 9.1 中展示的常规比较操作符, 以及 Table 9.39 和 Table 9.40 中展示的专用操作符和函数。

任何 cidr 值都可以隐式地转换为 inet; 因此, 下文展示的操作符和函数虽然被描述为作用于 inet, 但它们同样作用于 cidr 值。 (之所以存在分别针对 inet 和 cidr 的函数, 是因为这两种情况下的行为应当不同。) 此外, 允许把一个 inet 值转换为 cidr。 这样做时, 掩码右侧的任何位都会被静默地置零, 以产生一个有效的 cidr 值。

Table 9.39. 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


Table 9.40. IP 地址函数

函数

说明

示例

abbrev ( inet ) → text

以文本形式创建一个缩写的显示格式。 (结果与 inet 的输出函数产生的相同; 相对于显式转换为 text 的结果而言, 它才是 “缩写的”, 出于历史原因, 显式转换永远不会抑制掩码部分。)

abbrev(inet '10.1.0.0/32') → 10.1.0.0

abbrev ( cidr ) → text

以文本形式创建一个缩写的显示格式。 (缩写的方式是去掉掩码右侧的所有全零字节组; 更多例子见 Table 8.20。)

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


Tip

abbrev、 host 和 text 函数的主要意图是为 IP 地址提供替代的显示格式。

MAC 地址类型 macaddr 和 macaddr8 支持 Table 9.1 中展示的常规比较操作符, 以及 Table 9.41 中展示的专用函数。 此外, 它们支持按位逻辑操作符 ~、 & 和 | (NOT、AND 和 OR), 正如上文针对 IP 地址展示的那样。

Table 9.41. 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