2024年9月26日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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

8.9. 网络地址类型 #

PostgreSQL 提供数据类型来存储 IPv4、IPv6 和 MAC 地址,如表 8.21所示。最好使用这些类型而不是纯文本类型来存储网络地址,因为这些类型提供了输入错误检查和专门的操作符和函数(参见第 9.12 节)。

表 8.21. 网络地址类型

名称 存储大小 描述
cidr 7 或 19 字节 IPv4 和 IPv6 网络
inet 7 或 19 字节 IPv4 和 IPv6 主机和网络
macaddr 6 字节 MAC 地址
macaddr8 8 字节 MAC 地址(EUI-64 格式)

在对 inetcidr 数据类型进行排序时,IPv4 地址将始终排在 IPv6 地址之前,包括封装或映射到 IPv6 地址的 IPv4 地址,例如 ::10.2.3.4 或 ::ffff:10.4.3.2。

8.9.1. inet #

inet 类型保存 IPv4 或 IPv6 主机地址,以及可选的子网,所有这些都保存在一个字段中。子网由主机地址中存在的网络地址位数表示(netmask)。如果 netmask 为 32 且地址为 IPv4,则该值不表示子网,仅表示单个主机。在 IPv6 中,地址长度为 128 位,因此 128 位指定唯一的主机地址。请注意,如果您只想接受网络,则应使用 cidr 类型而不是 inet

此类型的输入格式为 address/y,其中 address 是 IPv4 或 IPv6 地址,y 是 netmask 中的位数。如果省略 /y 部分,则 netmask 将被视为 IPv4 的 32 或 IPv6 的 128,因此该值仅表示单个主机。在显示时,如果 netmask 指定单个主机,则会抑制 /y 部分。

8.9.2. cidr #

cidr 类型保存 IPv4 或 IPv6 网络规范。输入和输出格式遵循无类别域间路由约定。指定网络的格式为 address/y,其中 address 是网络的最低地址,表示为 IPv4 或 IPv6 地址,y 是 netmask 中的位数。如果省略 y,则它将使用旧的基于类的网络编号系统的假设进行计算,但它至少要足够大以包含输入中写入的所有八位字节。指定网络地址时,如果在指定的 netmask 右侧设置了位,则会发生错误。

表 8.22显示了一些示例。

表 8.22. cidr 类型输入示例

cidr 输入 cidr 输出 abbrev(cidr)
192.168.100.128/25 192.168.100.128/25 192.168.100.128/25
192.168/24 192.168.0.0/24 192.168.0/24
192.168/25 192.168.0.0/25 192.168.0.0/25
192.168.1 192.168.1.0/24 192.168.1/24
192.168 192.168.0.0/24 192.168.0/24
128.1 128.1.0.0/16 128.1/16
128 128.0.0.0/16 128.0/16
128.1.2 128.1.2.0/24 128.1.2/24
10.1.2 10.1.2.0/24 10.1.2/24
10.1 10.1.0.0/16 10.1/16
10 10.0.0.0/8 10/8
10.1.2.3/32 10.1.2.3/32 10.1.2.3/32
2001:4f8:3:ba::/64 2001:4f8:3:ba::/64 2001:4f8:3:ba/64
2001:4f8:3:ba:​2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:​2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:​2e0:81ff:fe22:d1f1/128
::ffff:1.2.3.0/120 ::ffff:1.2.3.0/120 ::ffff:1.2.3/120
::ffff:1.2.3.0/128 ::ffff:1.2.3.0/128 ::ffff:1.2.3.0/128

8.9.3. inetcidr #

inetcidr 数据类型之间的本质区别在于,inet 接受 netmask 右侧具有非零位的数值,而 cidr 则不接受。例如,192.168.0.1/24inet 有效,但对 cidr 无效。

提示

如果您不喜欢 inetcidr 值的输出格式,请尝试使用 hosttextabbrev 函数。

8.9.4. macaddr #

macaddr 类型存储 MAC 地址,例如以太网卡硬件地址(尽管 MAC 地址也用于其他目的)。以下格式接受输入

'08:00:2b:01:02:03'
'08-00-2b-01-02-03'
'08002b:010203'
'08002b-010203'
'0800.2b01.0203'
'0800-2b01-0203'
'08002b010203'

这些示例都指定了相同的地址。对于数字 af,接受大写和小写。

IEEE 标准 802-2001 将显示的第二种格式(带连字符)指定为 MAC 地址的规范形式,并将第一种格式(带冒号)指定为与位反转、MSB优先表示法一起使用,因此 08-00-2b-01-02-03 = 10:00:D4:80:40:C0。此约定如今已被广泛忽略,它仅与过时的网络协议(如令牌环)相关。PostgreSQL 不会提供位反转功能;所有接受的格式都使用规范的 LSB 顺序。

其余五种输入格式不属于任何标准。

8.9.5. macaddr8 #

macaddr8 类型以 EUI-64 格式存储 MAC 地址,例如以太网卡硬件地址(尽管 MAC 地址也用于其他目的)。此类型可以接受 6 字节和 8 字节长度的 MAC 地址,并以 8 字节长度的格式存储它们。以 6 字节格式给出的 MAC 地址将以 8 字节长度的格式存储,其中第 4 个和第 5 个字节分别设置为 FF 和 FE。请注意,IPv6 使用修改后的 EUI-64 格式,其中在从 EUI-48 转换后,应将第 7 位设置为 1。提供了 macaddr8_set7bit 函数来进行此更改。一般来说,任何由十六进制数字对(以字节为边界)组成的输入,可以选择用 ':''-''.' 中的一个一致地分隔,都会被接受。十六进制数字的数量必须为 16(8 字节)或 12(6 字节)。开头和结尾的空格将被忽略。以下是接受的输入格式示例

'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
'08002b-0102030405'
'0800.2b01.0203.0405'
'0800-2b01-0203-0405'
'08002b01:02030405'
'08002b0102030405'

这些示例都指定了相同的地址。对于数字 af,接受大写和小写。

上面显示的最后六种输入格式不属于任何标准。

要将 EUI-48 格式的传统 48 位 MAC 地址转换为修改后的 EUI-64 格式,以便将其包含为 IPv6 地址的主机部分,请使用 macaddr8_set7bit,如下所示

SELECT macaddr8_set7bit('08:00:2b:01:02:03');

    macaddr8_set7bit
-------------------------
 0a:00:2b:ff:fe:01:02:03
(1 row)

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。