🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 8.9\. 网络地址类型 PostgreSQL提供用于存储 IPv4 、IPv6 、MAC 地址的数据类型, 在[Table 8-21](#calibre_link-986)里显示。 用这些数据类型存储网络地址比用纯文本类型好, 因为这些类型提供输入错误检查和特殊的操作和功能(见[Section 9.12](#calibre_link-987))。 **Table 8-21\. 网络地址类型** | 名字 | 存储空间 | 描述 | | --- | --- | --- | | `cidr` | 7 或 19 字节 | IPv4 或 IPv6 网络 | | `inet` | 7 或 19 字节 | IPv4 或 IPv6 主机和网络 | | `macaddr` | 6 字节 | MAC 地址 | 在对`inet`或`cidr`数据类型进行排序的时候, 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](#calibre_link-988) 是些例子。 **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 | | ::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` `inet`和`cidr`类型之间的基本区别是`inet` 接受子网掩码,而`cidr`不接受。 > **Tip:** 如果你不喜欢`inet`或`cidr`值的输出格式, 请试一下`host`,`text`和`abbrev`函数。 ## 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'` | 它们声明的都是同一个地址。对于数据位`a`到`f`, 大小写都行。输出总是我们上面给出的第一种形式。 IEEE标准802-2001指定第二种形式(带连字符)为MAC地址的标准格式, 并指定的第一种形式(用冒号)为位反转符号,因此08-00-2b-01-02-03=01:00:4D:08:04:0C。 这个条约现在已很少使用,它和过时的网络协议(如令牌环)有关。 PostgreSQL对位反转没有规定,并且所有接受的格式使用LSB协议顺序。 其余四个输入格式不是任何标准的一部分。