8.8. 网络地址数据类型

PostgreSQL 提供用于存储 IPv4,IPv6 和 MAC 地址的数据类型, 在 Table 8-17 里显示。 用这些数据类型存储网络地址比用纯文本类型好,因为这些类型提供输入错误检查和好些种特殊的操作和功能。 (见 Section 9.11)。

Table 8-17. 网络地址类型

名字存储空间描述
cidr12 或 24 字节IPv4 和 IPv6 网络
inet12 或 24 字节IPv4 或 IPv6 网络和主机
macaddr6 字节MAC 地址

在对 inet 或者 cidr 数据类型进行排序的时候, IPv4 地址将总是排在 IPv6 地址前面,包括那些封装或者是映射在 IPv6 地址里 的 IPv4 地址,比如 ::10.2.3.4 或者 ::ffff::10.4.3.2。

8.8.1. inet

inet 在一个数据域里保存一个主机 IPv4 或 IPv6 地址, 以及一个可选的它所处的等效的子网。 子网的等效是通过计算主机地址中有多少位表示网络地址的方法来 表示的 ("网络掩码")。 如果网络掩码是 32 并且地址是 IPv4 ,那么不表示任何子网,只是一台主机。 在 IPv6 里,地址长度是 128 位,因此 128 位表明一个唯一的主机地址。 请注意如果你想只接受网络地址,你应该使用 cidr 类型而不是 inet

该类型的输入格式是 地址/y 这里 地址 是 IPv4 或者 IPv6 主机,y 是网络掩码的位数。 如果 /y 部分未填, 则网络掩码对 IPv 而言是 32,对 IPv6 而言是 128, 所以该值表示只有一台主机。 显示时,如果 /y 部分是 /32,将不会显示出来。

8.8.2. cidr

cidr 保存一个 IPv4 或 IPv6 网络地址声明。 其输入和输出遵循无类的互联网域路由(Classless Internet Domain Routing)习惯。 声明一个网络的格式是 地址/y 这里 地址 是 IPv4 或 IPv6 网络地址而 /y 是 网络掩码的二进制位数。 如果省略 /y, 那么掩码部分用旧的有类的网络编号系统进行计算,但要求输入的数据已经包括了确定掩码的所需的所有字节。 如果声明了一个网络地址,它的指定掩码的右边置了位,那么算错误。

Table 8-18是些例子:

Table 8-18. cidr 类型输入举例

cidr 输入cidr 显示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.8.3. inetcidr 对比

inetcidr 类型之间的基本区别是 inet 接受右边有非零位的网络掩码, 而 cidr 不接受。

提示: 如果你不喜欢 inetcidr 值的输出 格式,请试一下 hosttextabbrev 函数。

8.8.4. macaddr

macaddr 类型存储 MAC 地址,也就是以太网卡硬件地址 (尽管 MAC 地址还用于其它用途)。可以接受多种客户化的格式, 包括

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

它们声明的都是同一个地址。 对于数据位 af,大小写都行。 输出总是我们上面给出的最后一种形式。

PostgreSQL 源代码发布的 contrib/mac 目录里有一些可以将 MAC 地址映射为硬件制造商的名字的工具。