【问题标题】:decimal(s,p) or number(s,p)?小数(s,p)还是数字(s,p)?
【发布时间】:2012-06-17 09:16:34
【问题描述】:

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

但是,我的问题仍然存在 -

  1. 如何在内部处理这些数据?
  2. 使用 ANSI 类型而不是 Oracle 的内置类型是否有成本?
  3. 如果目标类型是Oracle内置类型,在数据迁移过程中会有影响吗?

【问题讨论】:

    标签: oracle db2 ansi type-conversion


    【解决方案1】:

    在 Oracle 中,they are the same

    创建表和集群的 SQL 语句也可以使用 ANSI 数据 IBM 产品 SQL/DS 和 DB2 中的类型和数据类型。甲骨文 识别不同于 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   
    

    【讨论】:

    • 没有数据转换:DECIMAL被存储并作为NUMBER处理。
    • @learn4living - Oracle 没有转换数据(存储在列中的值)它正在转换元数据(存储在数据字典中的内容)。所以唯一的代价就是你现在付出的代价:Oracle 从业者在面对非 Oracle 数据类型时会感到困惑。
    • 嗯,在我们的项目中,默认为零的比例使得差异和研究是值得的。谢谢大家的指点。
    • @VincentMalgrat:DECIMAL 与 NUMBER 不完全相同。正如 SYS.STANDARD DECIMAL 中定义的那样,定义为 NUMBER(38, 0),因此定义为 DECIMAL 的变量不能包含小数点右侧的任何数字,而定义为 NUMBER 的变量可以。要使 DECIMAL 值具有小数点右侧的数字,它们必须定义为例如十进制 (38, 4)。分享和享受。
    【解决方案2】:

    其实小数和数字是有区别的。 小数会截断超出比例的值,数字会将值四舍五入。

    【讨论】:

    • 我很想看到这个演示。 This fiddle 似乎表明 NUMBER 和 DECIMAL 都舍入了超标值。
    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多