十进制(s,p)或数字(s,p)?

Gya*_*yan 17 oracle db2 ansi type-conversion

最近,在处理db2 - > oracle迁移项目时,我们遇到了这种情况.开发人员无意中使用decimal(s,p)列创建新的表结构.我不记得Oracle支持这个,但后来一些挖掘表明它是一个ANSI数据类型,因此由oracle支持.

但问题仍然存在 -

  1. 这些数据是如何在内部处理的?
  2. 是否需要使用ANSI类型而不是Oracle的内置类型?
  3. 如果目标类型是Oracle内置类型,那么在数据迁移期间是否会产生影响?

Vin*_*rat 18

在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  
Run Code Online (Sandbox Code Playgroud)

但是,比例默认为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   
Run Code Online (Sandbox Code Playgroud)

  • @VincentMalgrat:DECIMAL与NUMBER不完全*相同.如SYS.STANDARD中定义的DECIMAL被定义为NUMBER(38,0),因此定义为DECIMAL的变量不能包含小数点右边的任何数字,而定义为NUMBER的变量可以.要在小数点右边有数字的DECIMAL值,必须将它们定义为例如DECIMAL(38,4).分享和享受. (4认同)
  • @ learn4living - Oracle不转换数据(存储在列中的值),它正在转换元数据(存储在数据字典中的内容).因此,唯一的成本就是您现在支付的价格:面临非Oracle数据类型的Oracle从业者之间的混淆. (3认同)