8.9. 网络地址类型

PostgreSQL 提供了用于存储 IPv4,IPv6 和 MAC 地址的数据类型,如Table 8.21所示。最好使用这些类型而不是纯文本类型来存储网络地址,因为这些类型提供 Importing 错误检查以及专门的运算符和功能(请参阅Section 9.12)。

表 8.21. 网络地址类型

NameStorage SizeDescription
cidr7 或 19 个字节IPv4 和 IPv6 网络
inet7 或 19 个字节IPv4 和 IPv6 主机和网络
macaddr6 bytesMAC addresses
macaddr88 bytesMAC 地址(EUI-64 格式)

在对inetcidr数据类型进行排序时,IPv4 地址将始终在 IPv6 地址之前排序,包括封装或 Map 到 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类型。

此类型的 Importing 格式为* address/y ,其中 address 是 IPv4 或 IPv6 地址,而 y 是网络掩码中的位数。如果缺少 /y ,则 IPv4 的网络掩码为 32,IPv6 的网络掩码为 128,因此该值仅表示一个主机。在显示时,如果网络掩码指定单个主机,则 /y *部分被抑制。

8.9.2. cidr

cidr类型保存 IPv4 或 IPv6 网络规范。Importing 和输出格式遵循无类 Internet 域路由约定。指定网络的格式为* address/y ,其中 address 是表示为 IPv4 或 IPv6 地址的网络,而 y 是网络掩码中的位数。如果省略 y *,则使用来自较旧的有类网络编号系统的假设进行计算,除非它至少足够大以包括 Importing 中写入的所有八位位组。指定具有设置为指定网络掩码右侧的位的网络地址是错误的。

Table 8.22显示了一些示例。

表 8.22. cidr类型 Importing 示例

cidrImportingcidr输出abbrev(cidr)
192.168.100.128/25192.168.100.128/25192.168.100.128/25
192.168/24192.168.0.0/24192.168.0/24
192.168/25192.168.0.0/25192.168.0.0/25
192.168.1192.168.1.0/24192.168.1/24
192.168192.168.0.0/24192.168.0/24
128.1128.1.0.0/16128.1/16
128128.0.0.0/16128.0/16
128.1.2128.1.2.0/24128.1.2/24
10.1.210.1.2.0/2410.1.2/24
10.110.1.0.0/1610.1/16
1010.0.0.0/810/8
10.1.2.3/3210.1.2.3/3210.1.2.3/32
2001:4f8:3:ba::/642001:4f8:3:ba::/642001:4f8:3:ba::/64
2001:4f8:3:ba:2e0:81ff:fe22:d1f1/1282001:4f8:3:ba:2e0:81ff:fe22:d1f1/1282001:4f8:3:ba:2e0:81ff:fe22:d1f1
::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 与 Cidr

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

Tip

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

8.9.4. macaddr

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

'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 Std 802-2001 指定第二种显示形式(带连字符)作为 MAC 地址的规范形式,并指定第一种形式(带冒号)作为位反转表示法,因此 08-00-2b-01-02- 03 = 01:00:4D:08:04:0C。如今,该约定已被广泛忽略,并且仅与过时的网络协议(例如令牌环)相关。 PostgreSQL 没有规定位反转,并且所有接受的格式都使用规范的 LSBSequences。

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

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进行更改。一般而言,接受由十六进制数字对(在字节边界上)组成的任何 Importing,这些 Importing 可选地由':''-''.'中的一个一致地分隔开。十六进制数字的数量必须为 16(8 个字节)或 12(6 个字节)。前导和尾随空格将被忽略。以下是可接受的 Importing 格式的示例:

'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接受大小写。输出始终以所示表格的第一个形式出现。上面提到的最后六种 Importing 格式不是任何标准的一部分。要将 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)