oracle decimal(s,p)还是number(s,p)?

2w2cym1i  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(180)

最近,在做一个db2 -〉oracle迁移项目时,我们遇到了这种情况。开发人员无意中使用十进制(s,p)列创建了新的表结构。我不记得Oracle支持这个,但后来的一些挖掘表明,它是一种ANSI数据类型,因此Oracle支持它。
但是,我的问题仍然存在-
1.内部如何处理这些数据?
1.使用ANSI类型而不是Oracle的内置类型是否有成本?
1.如果目标类型是Oracle内置类型,在数据迁移过程中是否会产生影响?

dnph8jn4

dnph8jn41#

在Oracle中,它们是相同的:
创建表和簇的SQL语句还可以使用ANSI数据类型以及IBM产品SQL/DS和DB2中的数据类型。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

但是,DECIMAL的比例默认为0,这意味着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
mrzz3bfm

mrzz3bfm2#

实际上,小数和数字是有区别的,小数会截断超出小数位的数值,数字会四舍五入。

相关问题