8.9. 网络地址类型

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

Table 8-21. 网络地址类型

名字存储空间描述
cidr7或19字节IPv4或IPv6网络
inet7或19字节IPv4 或 IPv6 网络和主机
macaddr6字节MAC 地址

在对inetcidr数据类型进行排序的时候, IPv4地址总是排在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网络地址。 其输入和输出遵循无类别的互联网域路由习惯。 声明一个网络的格式是address/y, 这里的address是IPv4或者IPv6地址, y是子网掩码的二进制位数。 如果省略y, 那么掩码部分用旧的有类别的网络编号系统进行计算, 但要求输入的数据已经包括了确定掩码所需的所有字节。 声明一个指定掩码的网络地址是错误的。

Table 8-22是些例子。

Table 8-22. 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.9.3. inetcidr对比

inetcidr类型之间的基本区别是inet接受子网掩码, 而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'
'08002b010203'

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

IEEE标准802-2001指定第二种形式(带连字符)为MAC地址的标准格式, 并指定的第一种形式(用冒号)为位反转符号,因此08-00-2b-01-02-03=01:00:4D:08:04:0C。 这个条约现在已很少使用,它至于过时的网络协议(如令牌环)有关。 PostgreSQL对位反转没有规定,并且所有接受的格式使用LSB协议顺序。

其余四个输入格式不是任何标准的一部分。