## 8.9.网络地址类型 [8.9.1.`内特`](datatype-net-types.html#DATATYPE-INET) [8.9.2.`苹果酒`](datatype-net-types.html#DATATYPE-CIDR) [8.9.3.`内特`与。`苹果酒`](datatype-net-types.html#DATATYPE-INET-VS-CIDR) [8.9.4.`马卡德尔`](datatype-net-types.html#DATATYPE-MACADDR) [8.9.5.`macaddr8`](datatype-net-types.html#DATATYPE-MACADDR8) [](<>) PostgreSQL提供数据类型来存储IPv4、IPv6和MAC地址,如中所示[表8.21](datatype-net-types.html#DATATYPE-NET-TYPES-TABLE)。最好使用这些类型而不是纯文本类型来存储网络地址,因为这些类型提供输入错误检查和专门的运算符和函数(请参阅[第9.12节](functions-net.html)). **表8.21.网络地址类型** | 名称 | 存储大小 | 描述 | | --- | ---- | --- | | `苹果酒` | 7或19字节 | IPv4和IPv6网络 | | `内特` | 7或19字节 | IPv4和IPv6主机和网络 | | `马卡德尔` | 6字节 | MAC地址 | | `macaddr8` | 8字节 | MAC地址(EUI-64格式) | 分拣时`内特`或`苹果酒`在数据类型中,IPv4地址总是在IPv6地址之前排序,包括封装或映射到IPv6地址的IPv4地址,例如::10.2.3.4或::ffff:10.4.3.2. ### 8.9.1. `内特` [](<>) 这个`内特`类型在一个字段中保存IPv4或IPv6主机地址以及可选的子网。子网由主机地址(“网络掩码”)中存在的网络地址位数表示。如果网络掩码为32,地址为IPv4,则该值不表示子网,仅表示单个主机。在IPv6中,地址长度为128位,因此128位指定一个唯一的主机地址。请注意,如果只接受网络,则应使用`苹果酒`输入而不是`内特`. 此类型的输入格式为*`地址/y`*哪里*`住址`*是IPv4或IPv6地址,并且*`y`*是网络掩码中的位数。如果*`/y`*省略部分,对于IPv4,网络掩码为32,对于IPv6,网络掩码为128,因此该值仅代表一台主机。展出的是*`/y`*如果网络掩码指定了单个主机,则部分将被抑制。 ### 8.9.2. `苹果酒` [](<>) 这个`苹果酒`类型包含IPv4或IPv6网络规范。输入和输出格式遵循无类Internet域路由约定。指定网络的格式为*`地址/y`*哪里*`住址`*网络的最低地址是否表示为IPv4或IPv6地址,以及*`y`*是网络掩码中的位数。如果*`y`*省略,它是使用旧的类网络编号系统的假设计算的,除非它至少足够大,可以包含输入中写入的所有八位字节。如果指定的网络地址的位设置在指定网络掩码的右侧,则会出错。 [表8.22](datatype-net-types.html#DATATYPE-NET-CIDR-TABLE)展示了一些例子。 **表8.22. `苹果酒`键入输入示例** | `苹果酒`输入 | `苹果酒`输出 | ``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 | | one hundred and ninety-two point one six eight | 192.168.0.0/24 | 192.168.0/24 | | one hundred and twenty-eight point one | 128.1.0.0/16 | 128.1/16 | | one hundred and twenty-eight | 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 | | ten point one | 10.1.0.0/16 | 10.1/16 | | ten | 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. `内特`与。`苹果酒` 两者的本质区别`内特`和`苹果酒`数据类型是什么`内特`接受网络掩码右侧非零位的值,而`苹果酒`没有。例如`192.168.0.1/24`有效期为`内特`但不是为了`苹果酒`. ### 提示 如果您不喜欢`内特`或`苹果酒`值,试试函数`主办`, `文本`和`阿伯雷夫`. ### 8.9.4. `马卡德尔` [](<>)[](<>) 这个`马卡德尔`类型存储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”` | 这些示例都指定了相同的地址。数字接受大写和小写`A.`通过`f`.输出始终以所示的第一种形式显示。 IEEE Std 802-2001将第二种形式(带连字符)指定为MAC地址的标准形式,并将第一种形式(带冒号)指定为位反转符号,以便08-00-2b-01-02-03=01:00:4D:08:04:0C。如今,这种约定被广泛忽略,并且只适用于过时的网络协议(如令牌环)。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:0203405”` | | `“08002b0102030405”` | 这些示例都指定了相同的地址。数字接受大写和小写`A.`通过`f`.输出始终以所示的第一种形式显示。 上面显示的最后六种输入格式不是任何标准的一部分。 要将EUI-48格式的传统48位MAC地址转换为修改后的EUI-64格式,以作为IPv6地址的主机部分,请使用`macaddr8_set7bit`如图所示: ``` SELECT macaddr8_set7bit('08:00:2b:01:02:03'); macaddr8_set7bit ```