Oracle 十进制(s,p)还是数字(s,p)?
最近,在执行db2->oracle迁移项目时,我们遇到了这种情况。 开发人员无意中使用十进制(s,p)列创建了新的表结构。我不记得Oracle支持这一点,但后来一些挖掘表明,它是一种ANSI数据类型,因此受到Oracle的支持 然而,我的问题仍然是:Oracle 十进制(s,p)还是数字(s,p)?,oracle,db2,ansi,type-conversion,Oracle,Db2,Ansi,Type Conversion,最近,在执行db2->oracle迁移项目时,我们遇到了这种情况。 开发人员无意中使用十进制(s,p)列创建了新的表结构。我不记得Oracle支持这一点,但后来一些挖掘表明,它是一种ANSI数据类型,因此受到Oracle的支持 然而,我的问题仍然是: 如何在内部处理这些数据 使用ANSI类型而不是Oracle的内置类型是否有成本 如果目标类型是Oracle内置类型,那么在数据迁移期间会有影响吗 在甲骨文中: 创建表和集群的SQL语句也可以使用ANSI数据 IBM产品SQL/DS和DB2中的类型和
DECIMAL(p,s)
在内部被视为一个数字(p,s)
:
但是,十进制
的刻度默认为0,这意味着十进制(*)
被视为数字(*,0)
,即整数
:
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
实际上,十进制和数字是有区别的。
Decimal将截断超出刻度的值,number将舍入该值。没有数据转换:
Decimal
存储并视为数字
@learn4living-Oracle没有转换数据(存储在列中的值),而是转换metatdata(存储在数据字典中的数据)。因此,唯一的代价就是你现在所付出的代价:Oracle从业者面临着非Oracle数据类型的困惑。好吧,在我们的项目中,默认为零的规模使差异和研究变得有价值。谢谢大家的指点。@VincentMalgrat:十进制和数字不完全一样。正如SYS.STANDARD中定义的那样,十进制被定义为数字(38,0),因此定义为十进制的变量不能包含小数点右侧的任何数字,而定义为数字的变量可以。要使小数点右边有数字,必须将其定义为十进制(38,4)。分享和享受。我很想看到这方面的演示。似乎表明数字和十进制四舍五入都超过了刻度值。
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