最近,在进行 db2 -> oracle 迁移项目时,我们遇到了这种情况。开发人员无意中使用十进制(s,p)列创建了新的表结构。我不记得 Oracle 支持这一点,但后来一些挖掘表明它是一个 ANSI 数据类型,因此被 oracle 支持。
然而,对我来说,问题仍然存在——
- 这些数据是如何在内部处理的?
- 使用 ANSI 类型而不是 Oracle 的内置类型有成本吗?
- 如果目标类型是Oracle内置类型,在数据迁移过程中会不会有影响?
最近,在进行 db2 -> oracle 迁移项目时,我们遇到了这种情况。开发人员无意中使用十进制(s,p)列创建了新的表结构。我不记得 Oracle 支持这一点,但后来一些挖掘表明它是一个 ANSI 数据类型,因此被 oracle 支持。
然而,对我来说,问题仍然存在——
在 Oracle 中,它们是相同的:
创建表和集群的 SQL 语句也可以使用来自 IBM 产品 SQL/DS 和 DB2 的 ANSI 数据类型和数据类型。Oracle 识别不同于 Oracle 数据库数据类型名称的 ANSI 或 IBM 数据类型名称。它将数据类型转换为等效的 Oracle 数据类型,将 Oracle 数据类型记录为列数据类型的名称,并根据下表所示的转换将列数据存储在 Oracle 数据类型中。
此引用下方的表格显示在DECIMAL(p,s)
内部被视为NUMBER(p,s)
:
SQL> create table t (a decimal(*,5), b number (*, 5));
Table created
SQL> desc t;
Name Type Nullable Default Comments
---- ----------- -------- ------- --------
A NUMBER(*,5) Y
B NUMBER(*,5) Y
但是,对于 ,比例默认为 0 DECIMAL
,这意味着将DECIMAL(*)
其视为NUMBER(*, 0)
,即INTEGER
:
SQL> create table t (a decimal, b number, c decimal (5), d decimal (5));
Table created
SQL> desc t;
Name Type Nullable Default Comments
---- --------- -------- ------- --------
A INTEGER Y
B NUMBER Y
C NUMBER(5) Y
D NUMBER(5) Y
实际上,十进制和数字之间是有区别的。十进制将截断超出比例的值,数字将舍入该值。