【PostgreSQL】从零开始:(二十四)数据类型-网络地址类型

2023-12-23 06:40:28

网络地址类型(Network Address Types)

概述

网络地址类型是指用于在互联网上唯一标识和定位计算机或设备的一种标识符。常见的网络地址类型包括以下几种:

  • IP地址(Internet Protocol Address):是互联网上用于标识计算机或设备的一种地址。IP地址分为IPv4和IPv6两种版本,其中IPv4使用32位地址,而IPv6使用128位地址。
  • IMAC地址(Media Access Control Address):是网络设备网卡上的硬件地址,用于唯一标识网络设备。MAC地址通常是由十六进制数字和冒号组成的一串字符串。
  • I域名(Domain Name):是通过域名系统(DNS)将可读性更好的名称映射为对应的IP地址。域名是由多个部分组成,以点分隔,例如www.example.com。
  • IURL(Uniform Resource Locator):是用于在互联网上定位和访问资源的一种地址。URL包含协议类型(如HTTP、FTP等)、主机名(域名或IP地址)、路径和文件名等信息。
  • IURI(Uniform Resource Identifier):是用于唯一标识和定位资源的一种字符串。URI包括URL和URN(Uniform Resource Name)两种形式,其中URL是URI的一种特定实现。

这些网络地址类型在网络通信中扮演着不同的角色,用于标识和定位计算机或设备、访问资源等。

PostgreSQL 的网络地址类型

PostgreSQL 提供了用于存储 IPv4、IPv6 和 MAC 地址的数据类型,如下表所示。最好使用这些类型而不是纯文本类型来存储网络地址,这些类型PostgreSQL提供了输入错误检查和专用运算符和函数。

名字存储大小描述
cidr7 或 19 字节IPv4 和 IPv6 网络
inet7 或 19 字节IPv4 和 IPv6 主机和网络
macaddr6 字节MAC 地址
macaddr88 字节MAC 地址(EUI-64 格式)

Inet

该类型在一个字段中保存 IPv4 或 IPv6 主机地址及其子网(可选)。子网由主机地址(“网络掩码”)中存在的网络地址位数表示。如果网络掩码为 32,地址为 IPv4,则该值不指示子网,仅指示单个主机。在 IPv6 中,地址长度为 128 位,因此 128 位指定唯一的主机地址。请注意,如果只想接受网络,则应使用cidr而不是inet.

此类型的输入格式为 address/y,其中 address 是 IPv4 或 IPv6 地址,y 是网络掩码中的位数。如果省略 /y 部分,则网络掩码将被视为 IPv4 的 32 或 IPv6 的 128,因此该值仅表示单个主机。在显示时,如果网络掩码指定单个主机,则禁止显示 /y 部分。

CREATE TABLE example (
    id serial PRIMARY KEY,
    ip_address inet
);

INSERT INTO example (ip_address) VALUES ('192.168.0.1');
INSERT INTO example (ip_address) VALUES ('192.168.0.0/24');

SELECT * FROM example;

Cidr

该类型包含 IPv4 或 IPv6 网络规范。输入和输出格式遵循无类别 Internet 域路由约定。指定网络的格式为 address/y,其中 address 是网络的最低地址,表示为 IPv4 或 IPv6 地址,y 是网络掩码中的位数。如果省略 y,则使用较旧的类网络编号系统的假设来计算它,除非它至少足够大,以包含输入中写入的所有八位字节。如果指定网络地址的位设置在指定网络掩码的右侧,则会出现错误。
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/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
CREATE TABLE networks ( id serial PRIMARY KEY, network_name text, network_address cidr );

INSERT INTO networks (network_name, network_address) VALUES ('Network1', '192.168.0.0/24'); INSERT INTO networks (network_name, network_address) VALUES ('Network2', '10.0.0.0/16'); INSERT INTO networks (network_name, network_address) VALUES ('Network3', '2001:db8::/32');

SELECT * FROM networks;

inet与cidr数据类型的区别

inet和cidr都是用来存储IP地址和IP地址范围的数据类型。它们之间的区别在于存储的精度和对IP地址的操作。

inet类型:inet类型用于存储单个IP地址或IPv6地址。它可以接受形如192.168.0.1或2001:0db8:85a3:0000:0000:8a2e:0370:7334的IP地址作为值。inet类型的值可以表示一个具体的IP地址,也可以表示一个IP地址范围,例如192.168.0.0/24表示一个IP地址范围。

cidr类型:cidr类型用于存储IP地址范围。它可以接受形如192.168.0.0/24或2001:0db8::/32的值,其中带有斜杠(/)表示地址的网络前缀长度。cidr类型的值表示一个网络的地址范围,它包含了该网络的所有IP地址。

在对inet和cidr类型的数据进行操作时,PostgreSQL提供了一些特殊的运算符和函数,用于计算、比较和过滤IP地址和IP地址范围。

总结起来,inet类型适用于存储单个IP地址和IP地址范围,而cidr类型适用于存储IP地址范围,并且提供了更丰富的操作方法。

Macaddr

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

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

这些示例都指定了相同的地址。接受大写和小写来表示数字。
IEEE 标准 802-2001 将显示的第二种形式(带连字符)指定为 MAC 地址的规范形式,并指定第一种形式(带冒号)与位反转、MSB 优先表示法一起使用,因此 08-00-2b-01-02-03 = 10:00:D4:80:40:C0。这个约定现在被广泛忽略,它只与过时的网络协议(如令牌环)相关。PostgreSQL 没有为位反转提供任何规定;所有接受的格式都使用规范的 LSB 顺序。

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

CREATE TABLE devices ( id serial PRIMARY KEY, device_name text, mac_address macaddr );

INSERT INTO devices (device_name, mac_address) VALUES ('Device1', '00:11:22:33:44:55'); INSERT INTO devices (device_name, mac_address) VALUES ('Device2', 'AA:BB:CC:DD:EE:FF'); INSERT INTO devices (device_name, mac_address) VALUES ('Device3', '11:22:33:44:55:66');

SELECT * FROM devices;

注意:macaddr类型不强制MAC地址的有效性。由应用程序来确保将有效的MAC地址插入到数据库中。

macaddr8

PostgreSQL中的macaddr8数据类型是在9.3版本中作为macaddr数据类型的扩展引入的。它允许以8字节格式存储MAC地址,其中包括6字节的MAC地址和额外的2字节扩展。

该类型以 EUI-64 格式存储 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:02030405'
'08002b0102030405'

这些示例都指定了相同的地址。接受大写和小写来表示数字。输出始终采用显示的第一个表单

上面显示的最后六种输入格式不属于任何标准。

要将 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)

macaddr8类型还提供了各种功能和操作符,可以对MAC地址进行各种操作,例如比较两个MAC地址、转换不同格式的MAC地址等。

文章来源:https://blog.csdn.net/sinat_36528886/article/details/135119424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。