迁移 Oracle 到 PostgreSQL: 数据类型映射关系

七月 7, 2023

Oracle 和 PostgreSQL 各自都有着丰富的内置数据类型可用。在从 Oracle 迁移到 PostgreSQL 时,需要合理地将 Oracle 的数据类型转换到 PostgreSQL 中匹配的类型。

转换 Oracle 的数据类型到 PostgreSQL

下表列出了 Oracle 和 Postgres 数据类型之间的显著差异。

Oracle PostgreSQL 说明
VARCHAR2(n) VARCHAR(n) 注意不要混淆 Oracle 和 PostgreSQL 数据类型中的 “n”。在 Oracle 中,它代表以字节为单位的大小;在 PostgreSQL 中,它代表字符数。
NVARCHAR, NVARCHAR2 VARCHARTEXT
CHAR(n), NCHAR(n) CHAR(n) 注意不要混淆 Oracle 和 PostgreSQL 数据类型中的 “n”。在 Oracle 中,它代表以字节为单位的大小;在 PostgreSQL 中,它代表字符数。
NUMBER(n, m) NUMERIC(n,m) NUMBER 类型可以转换为 NUMERIC,其大小不受限制。但是,SMALLINT、INT、BIGINT、REAL 和 DOUBLE PRECISION 数据类型提供了更好的性能。不过,统一将 NUMBER 类型转换为 NUMERIC 也是有好处的,你不需要处理多种数字类型之间的转换规则问题。
NUMBER(4) SMALLINT
NUMBER(9) INT
NUMBER(18) BIGINT
NUMBER(n) NUMERIC(n) 如果 n>=19
BINARY_INTEGER, BINARY_FLOAT INTEGER, FLOAT
DATE TIMESTAMP(0) 在 Oracle 中,DATE 类型同时返回日期和时间,而在 PostgreSQL 中,DATE 类型返回不带时间的日期。
TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMPTZ Oracle 同时具有 “TIMESTAMP WITH TIME ZONE” 和 “TIMESTAMP WITH LOCAL TIME ZONE” 数据类型。PostgreSQL 的 TIMESTAMPTZ 等同于 “TIMESTAMP WITH LOCAL TIME ZONE”。如果这些混淆,可能会引入错误。
CLOB, LONG TEXT PostgreSQL 的 TEXT 类型能够存储多达 1 GB 的文本数据。
BLOB,RAW(n),LONG RAW BYTEA(1 GB 限制)
大对象
在 Oracle 中,BLOB 数据类型用于非结构化二进制数据,基本上没有大小限制(最多 128 TB 的二进制数据)。PostgreSQL 的 BYTEA 数据类型可以存储多达 1 GB 的二进制数据。超过该限制,请使用大型对象(这些对象存储在单独的表中)。
NLS_DATE_FORMAT DateStyle 这些参数设置日期信息的显示格式。PostgreSQL 的 DateStyle 的默认样式是 ISO。Oracle 的默认值继承自 NLS_TERRITORY 参数。