七月 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 | VARCHAR 或 TEXT | |
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 参数。 |