暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在 Oracle vs PostgreSQL vs SQL Server 中存储网络地址

原创 Ellison 2023-02-22
657

Oracle,PostgreSQL和SQL Server支持各种非常相关的数据类型。在从Oracle迁移到PostgreSQL和SQL Server迁移到PostgreSQL的过程中,我们看到在Oracle或SQL Server和PostgreSQL之间映射数据类型并不是一项艰巨的任务。但是,PostgreSQL中存在一些有趣的数据类型,这些数据类型在Oracle或SQL Server中是看不到的。其中三种数据类型是inet,cidr和macaddr。在本文中,我们将详细讨论在 Oracle vs SQL Server 和 PostgreSQL 中存储网络地址。

在 Oracle vs PostgreSQL vs SQL Server 中存储网络地址

在迁移之前检查数据以确定目标数据类型

我们在迁移方面的专业知识帮助我们为所有客户环境实施了各种最佳做法。其中一个最佳做法是实现适当的目标数据类型。由于缺乏对迁移后遗症的专业知识,人们可能会选择Oracle和PostgreSQL或SQL Server和PostgreSQL之间的默认数据类型映射,当您进行Google搜索或使用Ora2Pg或AWS SCT等时,可能会出现该映射。还有很多工具和文章可以显示默认数据类型映射。但是,它们都没有提供在选择数据类型之前检查数据的想法。出于这个原因,Oracle 中的 varchar 可能总是映射到 Postgres 中的 varchar 或文本。

MigOps 通常使用自行开发的解决方案检查数据,以确定 PostgreSQL 的数据类型。它基于 Oracle 和 SQL Server 中的数据类型,具有高级性能优势。

网络地址

IP 地址(IPv4 和 IPv6)和 MAC 地址是网络地址的示例。

为什么我们需要专门的数据类型来存储网络地址?

当需要将网络地址存储在数据库中时,如果没有严格的输入检查,数据库可能会接受不正确的用户输入。同样,如果没有运算符和函数来支持对此类数据的查询,则可能会影响性能或用于执行基于字符串的搜索的其他资源。因此,存储网络地址的数据类型将非常有用。

现在让我们进一步讨论,详细讨论在 Oracle vs PostgreSQL 和 SQL Server 中存储网络地址。

要在我们发布此类有用文章时收到通知,请立即订阅我们的时事通讯

在 SQL Server 中存储网络地址

SQL Server 没有专门为存储 IP 地址而设计的数据类型。因此,varchar 用于存储 IP 地址。当我们需要在某个范围内搜索 IP 时,这不会提供任何优化,因为数据被视为文本/字符串。

create table store_ip_address(ip_add varchar(18));
insert into store_ip_address values ('192.168.12.11');
insert into store_ip_address values ('192.168.12.11/24');

select * from store_ip_address;
ip_add
--------------------
192.168.12.11
192.168.12.11/24
在 Oracle 中存储网络地址

与SQL Server类似,Oracle没有专为存储IP地址而设计的数据类型。出于这个原因,我们应该在 Oracle 的情况下再次使用 varchar。这可能会增加性能瓶颈。

create table store_ip_address(ip_add varchar(18));
insert into store_ip_address values ('192.168.12.11');
insert into store_ip_address values ('192.168.12.11/24');

select * from store_ip_address;
IP_ADD
----------------------
192.168.12.11
192.168.12.11/24
在PostgreSQL中存储网络地址

与Oracle和SQL服务器相比,PostgreSQL对某些类型的数据有更好的支持。当我们谈论网络地址时,是的,我们有称为 inet 和 cidr 的数据类型。

INET接受网标右侧的零位,而CIDR则不接受。让我们以 192.168.0.3/24 为例。此输入可用于 inet 但当 cidr 用作数据类型时无法访问。

为简单起见,我们可以将ipv4和ipv6地址存储在inet数据类型中。我们可以在插入时给出一个子网掩码,如果没有,默认情况下会拿 32 作为子网掩码。

create schema test_schema;

create table test_schema.store_ip_address(ip_add inet);

insert into test_schema.store_ip_address values ('192.168.12.11');
insert into test_schema.store_ip_address values ('192.168.12.1');
insert into test_schema.store_ip_address values ('192.168.12.1/24');
insert into test_schema.store_ip_address values ('2001:0db8:85a3:0000:0000:8a2e:0370:7334');

如果我们只想插入网络,我们可以使用 cidr 数据类型。

create table test_schema.store_cidr_address(cidr_add cidr);

insert into test_schema.store_cidr_address values ('192.168.12.0/24');

如果我们想存储一个MAC地址,我们还有两种数据类型macaddrmacaddr8。让我们创建一个表来了解这些数据类型的用法。我们可以使用不同的格式插入 mac 地址。通常使用“:”、“-”或“”分隔它们。

create table test_schema.store_mac_address(mac_addr1 macaddr, mac_addr2 macaddr8);

insert into test_schema.store_mac_address values ('40:2C:84:DB:35:2C', '40:2C:84:DB:35:2C:04:05');
insert into test_schema.store_mac_address values ('40-2C-84-DB-35-2C', '40-2C-84-DB-35-2C-04-05');
insert into test_schema.store_mac_address values ('402C.84DB.352C', '402C.84DB.352C.0405');
insert into test_schema.store_mac_address values ('402C84DB352C', '402C84DB352C0405');

postgres=# select * from test_schema.store_mac_address;
mac_addr1         | mac_addr2
------------------+-------------------------
40:2c:84:db:35:2c | 40:2c:84:db:35:2c:04:05
40:2c:84:db:35:2c | 40:2c:84:db:35:2c:04:05
40:2c:84:db:35:2c | 40:2c:84:db:35:2c:04:05
40:2c:84:db:35:2c | 40:2c:84:db:35:2c:04:05
(4 rows)

让我们以一些网络地址函数和运算符为例。

如果您想检查 ip 是否在一个子网中,我们可以使用以下命令进行检查。

postgres=# select '192.168.12.22'::inet << '192.168.12.0/24'::inet;
 ?column?
----------
 t
(1 row)

如果要检查 ip 是否在特定子网中或等于,我们应该使用以下查询。

postgres=# select '192.168.12.0/24'::inet <<= '192.168.12.0/24'::inet;
 ?column?
----------
 t
(1 row)

postgres=# select ip_add, ip_add <<= '192.168.12.0/24'::inet from test_schema.store_ip_address;
            ip_add            | ?column?
------------------------------+----------
 192.168.12.11                | t
 192.168.12.1                 | t
 192.168.12.1/24              | t
 2001:db8:85a3::8a2e:370:7334 | f

我们可以使用一些函数来计算广播地址、网络掩码值等。

postgres=# SELECT ip_add, broadcast(ip_add), netmask(ip_add) 
FROM test_schema.store_ip_address;

     ip_add      |     broadcast     |     netmask
-----------------+-------------------+-----------------
 192.168.12.11   | 192.168.12.11     | 255.255.255.255
 192.168.12.1    | 192.168.12.1      | 255.255.255.255
 192.168.12.1/24 | 192.168.12.255/24 | 255.255.255.0
(3 rows)

您可以在本文中参考一些关于 inet 和 cidr 数据类型的更有趣的运算符和函数。

结论

如本文所述,PostgreSQL具有有趣的数据类型,这些数据类型目前在Oracle和PostgreSQL中不可用。在Oracle和SQL服务器中存储某些类型的数据(例如网络地址)时,我们必须编写自己的函数来获取输出。在PostgreSQL的情况下,它们是预定义的,可以随时使用。在从Oracle迁移到PostgreSQL和SQL Server迁移到PostgreSQL的过程中,还有其他几个未知的PostgreSQL功能需要考虑。立即联系 MigOps,在迁移之前或之后执行评估。您还可以填写以下表格与我们的一位专家取得联系。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论