《卸甲笔记》-PostgreSQL和Oracle的数据类型的对比系列五:其它类型

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用。随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多。数据库之间数据迁移的时候,首先遇到的,并且也是最重要的,就是数据类型之间的转换。下面根据自己的理解和测试,写了一些数据类型之间的差异以及迁移时的注意事项的文章,不足之处,尚请多多指教。

其它类型

Oracle的内建数据类型中,还有一些其它的类型。不能够归类到字符、数字、时间和大数据类型等。比如RAW, ROWID, UROWID等。在数据迁移的时候,在PostgreSQL中也有与之相对应的类型。

1、RAW类型

Oracle的RAW类型主要用于不同的系统之间转移数据的时候。用于保存位串,以字节为单位。作为数据库列的数据类型的时候,最大位数为2000(作为变量的时候,最大位数为32767。因为现在谈论的是数据迁移,所以作为变量的情况就不讨论了)。

PostgreSQL中,可以使用bytea来对应RAW类型。

Oracle RAW

SQL> create table o_test(value raw(2000));

表已创建。

SQL> create table o_test2(value raw(2001));
create table o_test2(value raw(2001))
                               *
第 1 行出现错误:
ORA-00910: 指定的长度对于数据类型而言过长

SQL> insert into o_test values(utl_raw.cast_to_raw('Hello! This is John'));

已创建 1 行。

SQL> select * from o_test;

VALUE
--------------------------------------------------------------------------------
48656C6C6F212054686973206973204A6F686E

PostgreSQL bytea

postgres=# create table p_test(value bytea);
CREATE TABLE
postgres=# insert into p_test values(cast('Hello! This is John' as bytea));
INSERT 0 1
postgres=# select * from p_test;
                  value
------------------------------------------
 \x48656c6c6f212054686973206973204a6f686e
(1 行记录)

2、ROWID类型

Oracle的ROWID类型代表一条记录在数据库中的物理地址。使用BASE64编码的字符串表示的物理地址。固定是18位。ROWID是Oracle中的伪列,也可以定义一个ROWID类型的列,但是必须用户自己保证该列的数据有效性。
PostgreSQL中,可以使用char(18)来迁移对象。PostgreSQL中还有一个CTID数据类型, 指的是一条记录位于哪个数据块的哪个位移上面。作用和ROWID类似。但是用的是数字对,数据迁移时,不能够使用它对Oracle的ROWID进行迁移。

Oracle ROWID

SQL> create table o_test(value1 int, value2 rowid);

表已创建。

SQL> insert into o_test values(1, '1234567890ABCDEFAB');

已创建 1 行。

SQL> insert into o_test values(2, '1234567890ABCDEFABC');
insert into o_test values(2, '1234567890ABCDEFABC')
                             *
第 1 行出现错误:
ORA-01410: 无效的 ROWID

SQL> select * from o_test;

    VALUE1 VALUE2
---------- ------------------
         1 B23456AM9AABCDEFAB

SQL> select t.rowid, t.* from o_test t;

ROWID                  VALUE1 VALUE2
------------------ ---------- ------------------
AAASQiAAEAAAAJ8AAA          1 B23456AM9AABCDEFAB

PostgreSQL char(18)

postgres=# create table p_test(value1 int , value2 char(18));
CREATE TABLE
postgres=# insert into p_test values(1, 'B23456AM9AABCDEFAB');
INSERT 0 1
postgres=# insert into p_test values(1, 'AAASQiAAEAAAAJ8AAA');
INSERT 0 1
postgres=# select * from p_test;
 value1 |       value2
--------+--------------------
      1 | B23456AM9AABCDEFAB
      1 | AAASQiAAEAAAAJ8AAA
(2 行记录)
postgres=# select ctid, * from p_test;
 ctid  | value1 |       value2
-------+--------+--------------------
 (0,1) |      1 | B23456AM9AABCDEFAB
 (0,2) |      1 | AAASQiAAEAAAAJ8AAA
(2 行记录)

3、UROWID类型

Oracle的UROWID类型支持Oracle的物理ROWID和逻辑ROWID,在索引组织表(Index Organization Table,简称为IOT)中的ROWID,就是逻辑ROWID。并且支持非Oracle数据库的表的ROWID。也就是支持所有类型的ROWID。最大长度是4000。
PostgreSQL中,可以使用varchar来迁移对象。

Oracle UROWID

SQL> create table o_test(value1 int, value2 urowid);

表已创建。

SQL> insert into o_test values(1,'AAASQiAAEAAAAJ8AAA');

已创建 1 行。

SQL> select value2 from o_test;

VALUE2
--------------------------------------------------------------------------------
AAASQiAAEAAAAJ8AAA

SQL> create  table o_test2(id number primary key) organization index;

表已创建。

SQL> insert into o_test2 values('12345');

已创建 1 行。

SQL> insert into o_test2 values('12345989873827276839302');

已创建 1 行。

SQL> set numw 25
SQL> select t.rowid, t.* from o_test2 t;

ROWID                                                            ID
----------------------------------------- -------------------------
*BAEAAjMEwwIYLv4                                              12345
*BAEAAjMNzAIYLmNjSlNJTVReA/4                12345989873827276839302

PostgreSQL VARCHAR

postgres=# create table p_test(value varchar);
CREATE TABLE
postgres=#  insert into p_test values('AAASQiAAEAAAAJ8AAA');
INSERT 0 1
postgres=#  insert into p_test values('*BAEAAjMEwwIYLv4');
INSERT 0 1
postgres=#  insert into p_test values('*BAEAAjMNzAIYLmNjSlNJTVReA/4');
INSERT 0 1
postgres=# select value,length(value) from p_test;
            value             | length
------------------------------+--------
 AAASQiAAEAAAAJ8AAA           |     18
 *BAEAAjMEwwIYLv4             |     16
 *BAEAAjMNzAIYLmNjSlNJTVReA/4 |     28
(3 行记录)

Oracle的build-in类型里面的这几种特殊的数据类型,在数据迁移中是比较简单的。在向PostgreSQL数据库进行数据迁移的时候只要选对数据类型,应该就可以正确的迁移过来。

参考文档:

PostgreSQL 9.4.4 中文手册:字符类型,二进制类型,对象标识符类型
http://www.postgres.cn/docs/9.4/datatype-binary.html (二进制类型)
http://www.postgres.cn/docs/9.4/datatype-character.html (字符类型)
Database SQL Language Reference:Data Types
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#i45441

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
11天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
38 2
|
5月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错之使用SQL 将 PostgreSQL 的 date 类型字段转换为 TIMESTAMP 类型时遇到报错,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
运维 Oracle 容灾
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
|
3月前
|
存储 Oracle 关系型数据库
|
2月前
|
分布式计算 Oracle 关系型数据库
实时计算 Flink版产品使用问题之获取Oracle的数据时无法获取clob类型的数据,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
SQL Oracle 关系型数据库
关系型数据库Oracle备份类型
【7月更文挑战第18天】
41 2
|
4月前
|
SQL 数据采集 Oracle
实时计算 Flink版产品使用问题之如何读取oracle中的blob类型的数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
Oracle 关系型数据库 数据库
oracle基本操作笔记分享
oracle基本操作笔记分享
34 0
|
5月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
134 0
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
|
5月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在 DataWorks 中,使用Oracle作为数据源进行数据映射和查询,如何更改数据源为MaxCompute或其他类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
61 1

热门文章

最新文章

推荐镜像

更多