受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

8.9. 网络地址类型 #

PostgreSQL 提供了用于存储 IPv4、IPv6 和 MAC 地址的数据类型,如 Table 8.21 所示。使用这些数据类型来存储网络地址,比使用纯文本类型更好, 因为它们提供了输入错误检查以及专门的操作符和函数 (见 Section 9.12)。

Table 8.21. 网络地址类型

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

在对 inetcidr 数据类型排序时,IPv4 地址总是排在 IPv6 地址之前,包括那些封装在 IPv6 地址中或映射到 IPv6 地址中的 IPv4 地址,例如 ::10.2.3.4::ffff:10.4.3.2

8.9.1. inet #

inet 在一个字段中保存 IPv4 或 IPv6 主机地址, 以及可选的子网信息。子网由主机地址中包含的网络地址位数 (即网络掩码)表示。如果网络掩码为 32 且地址是 IPv4,那么该值表示的不是子网,而只是单个主机。在 IPv6 中, 地址长度为 128 位,因此 128 位表示一个唯一的主机地址。请注意, 如果你只想接受网络地址,应使用 cidr 类型,而不是 inet

该类型的输入格式为 address/y,其中 address 是 IPv4 或 IPv6 地址,而 y 是网络掩码中的位数。如果省略 /y 部分,则 IPv4 的网络掩码取 32,IPv6 的网络掩码取 128,因此该值表示单个主机。 显示时,如果 /y 部分表示的是单个主机,则它不会被显示出来。

8.9.2. cidr #

cidr 类型保存 IPv4 或 IPv6 网络说明。输入和输出格式 遵循无类别域间路由(CIDR)约定。指定网络的格式为 address/y,其中 address 是网络最低地址的 IPv4 或 IPv6 表示,而 y 是网络掩码中的位数。 如果省略 y,则会按照旧式 的分类网络编号系统假设来计算,但至少会大到足以覆盖输入中写出的 所有八位组。若指定的网络地址在所给网络掩码右侧仍有置位比特,则会 报错。

Table 8.22展示了一些示例。

Table 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. inet vs. cidr #

inetcidr 两种数据类型的本质区别在于: inet 接受网络掩码右侧仍含有非零位的值,而 cidr 不接受。例如,192.168.0.1/24inet 是有效的,但对 cidr 无效。

Tip

如果你不喜欢 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地址的第二种形式(带连字符)作为规范形式, 并指定第一种形式(带冒号)用于位反转、最高位在前的表示法,因此 08-00-2b-01-02-03 = 10:00:D4:80:40:C0。这种约定现在被广泛 忽略,仅适用于过时的网络协议(如Token Ring)。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)

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。