【问题标题】:Difference between number and integer datatype in oracle dictionary viewsoracle字典视图中数字和整数数据类型之间的区别
【发布时间】:2012-11-09 17:57:39
【问题描述】:

我使用 oracle 字典视图来找出两个模式之间的列差异(如果有的话)。在同步数据类型差异时,我发现 NUMBER 和 INTEGER 数据类型都存储在 all_tab_columns/user_tab_columns/dba_tab_columns 中,因此很难同步一个模式/列具有数字数据类型而另一个模式/列具有整数数据类型的数据类型差异.

在比较模式时,它显示数据类型不匹配。请建议是否有任何其他替代形式使用字典视图,或者是否可以使用字典视图中的任何特定属性来识别数据类型是否为整数。

【问题讨论】:

  • :Number 是 oracle 的 built in 数据类型,而 IntegerANSI datatypes 和来自 IBM 产品 SQL/DS 和 DB2 的数据类型,所以 Oracle 内部转换 Integer to NUMBER(38) 。我认为从SELECT DBMS_METADATA.GET_DDL('TABLE', '<table_name>','<schema_name>') AS DDL FROM DUAL;获取实际数据类型的唯一方法
  • 这是我考虑的最后一个选项,因为我只有很少的差异,它会影响性能,而且从不同的表中获取列位置也很乏味。
  • 专家您好,有什么其他建议请...
  • 我得到了 oracle 支持的回复,指出整数数据类型已被弃用并保留关键字以保持兼容性。整数数据类型被视为 number(38,0) 数据类型。
  • Oracle 支持的回复不是很有帮助,因为 INTEGER 仍在大量使用中,并且正如您所发现的,由 SQL*Plus DESCRIBE 等实用程序报告。根据我的测试,似乎在 data_type = 'NUMBER'、data_precision 为 null 且 data_scale = 0 的情况下报告了 INTEGER,但很高兴看到官方确认。

标签: oracle11g


【解决方案1】:

我找到的最好的解释是:

INTEGER 和 NUMBER 有什么区别?我们什么时候应该使用 NUMBER,什么时候应该使用 INTEGER?我只是想在这里更新我的 cmets...

NUMBER 始终按我们输入的方式存储。比例为 -84 到 127。但 INTEGER 会四舍五入为整数。 INTEGER 的小数位数为 0。INTEGER 等价于 NUMBER(38,0)。这意味着,INTEGER 是受约束的数字。小数位将被四舍五入。但 NUMBER 不受限制。

  • 整数(12.2) => 12
  • 整数(12.5) => 13
  • 整数(12.9) => 13
  • 整数(12.4) => 12
  • NUMBER(12.2) => 12.2
  • NUMBER(12.5) => 12.5
  • NUMBER(12.9) => 12.9
  • NUMBER(12.4) => 12.4

INTEGER 总是比 NUMBER 慢。由于整数是一个带有附加约束的数字。强制执行约束需要额外的 CPU 周期。我从来没有看到任何差异,但是当我们在 INTEGER 列上加载数百万条记录时可能会有差异。如果我们需要确保输入是整数,那么 INTEGER 是最好的选择。否则,我们可以坚持使用 NUMBER 数据类型。

这里是link

【讨论】:

  • 所以回到OP的问题,你是说解决方案是检查data_scale = 0吗?根据我的测试,似乎 data_precision 也必须为空,否则 DESCRIBE 等显示 NUMBER。
【解决方案2】:

整数仅适用于被 Oracle 弃用的 sql 标准。

您应该改用数字。

Oracle 在后台将整数存储为 Number。

最常见的情况是为 ID 存储整数,并且它们是在没有参数的情况下定义的 - 因此理论上您可以查看元数据视图的比例和精度列,以查看无法存储十进制值 - 但是 99%这无济于事。

如上所述,您可以查找 number(38,0) 列或类似列(即不允许小数点的列),但这只会告诉您哪些列不能带小数,而不是定义了哪些列以便 INTS可以保存。

建议: 对数字列进行数据分析。像这样的:

 select max( case when trunc(column_name,0)=column_name then 0 else 1 end ) as has_dec_vals
 from table_name

【讨论】:

    【解决方案3】:

    这是我从oracle documentation 得到的,但它适用于 oracle 10g 第 2 版:

    当您定义一个 NUMBER 变量时,您可以指定它的精度 (p) 和小数位数 (s),以便它足够大,但不是不必要的大。精度是有效位数。规模可以是正的或负的。正刻度标识小数点右边的位数;负数表示小数点左边可以向上或向下舍入的位数。

    NUMBER 数据类型受 Oracle 数据库标准库支持,其运行方式与在 SQL 中的运行方式相同。当文本或 INTEGER 数据类型不合适时,它用于维度和代理项。它通常分配给不用于计算的变量(如预测和聚合),并且用于必须匹配数据库的舍入行为或需要高精度的变量。在决定是否将 NUMBER 数据类型分配给变量时,请记住以下事实以最大限度地提高性能

    • NUMBER 变量的分析工作区计算比其他数值数据类型慢,因为 NUMBER 值是在软件中计算的(为了准确性)而不是在硬件中(为了速度)。
    • 当数据从分析工作区提取到具有 NUMBER 数据类型的关系列时,当数据在分析工作区中已经具有 NUMBER 数据类型时性能最佳,因为不需要转换步骤。

    【讨论】:

    • 这与查询字典视图时区分NUMBER和INTEGER有什么关系吗?
    猜你喜欢
    • 2019-07-27
    • 2011-07-18
    • 2015-12-08
    • 1970-01-01
    • 2017-03-18
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多