【问题标题】:How does FLOAT map/relate to NUMBER in Oracle 10g?FLOAT 如何映射/关联到 Oracle 10g 中的 NUMBER?
【发布时间】:2013-06-29 05:53:48
【问题描述】:

Oracle 10g 中的 FLOAT 数据类型是什么,它与 NUMBER 有何关系?

我可以在 Oracle 文档中找到 FLOAT 的唯一参考是在此页面的 BINARY_DOUBLE 部分:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i140621 它似乎表明它存储一个浮点数并允许您指定精度位,但它没有'不引用 NUMBER 类型。 11g 文档根本没有提到 FLOAT。

《专家级 Oracle 数据库架构:Oracle 数据库 9i、10g 和 11g 编程技术和解决方案,第二版》一书说:

除了 NUMBER、BINARY_FLOAT 和 BINARY_DOUBLE 类型之外,Oracle 在语法上还支持以下数字数据类型:

当我说“语法支持”时,我的意思是 CREATE 语句可能会使用这些数据类型,但实际上它们都是 NUMBER 类型。 ...

  • FLOAT(p):映射到 NUMBER 类型。

我不明白的是如何它映射到NUMBER。

NUMBER(p) 允许我指定精度,但刻度默认为 0。似乎 FLOAT(p) 映射到 NUMBER(decimal p, *),即固定精度但可变刻度,这不是 NUMBER 类型所允许的据我所知。

那么,FLOAT 不仅仅是一个别名,还提供了 NUMBER 本身不提供的行为?

【问题讨论】:

  • 我没有方便检查的 Oracle 实例,但如果我没记错的话,FLOAT 在 SYS.STANDARD 包中定义为 NUMBER 的子类型。 (在 Oracle 中,大多数 数字类型是 NUMBER 的子类型。我相信 BINARY_FLOAT 和 BINARY_DOUBLE 是极少数例外之一。PLS_INTEGER 可能是另一种,但我不确定 - 检查 SYS.STANDARD )。
  • @BobJarvis 是的,上面写着subtype FLOAT is NUMBER; -- NUMBER(126),但又一次写着subtype BINARY_FLOAT is NUMBER;...

标签: sql oracle oracle10g


【解决方案1】:

10g 中的文档有点不清楚。从 11.1 开始,它有了很大的改进:

http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#sthref94

综上所述,FLOATNUMBER 相同,但有两处不同

  1. FLOAT 无法指定比例
  2. FLOAT 中,精度以二进制位给出,NUMBER 以十进制位给出,所以FLOAT(126) 表示126 位精度,NUMBER(38) 表示38 位十进制精度

编辑 一些例子表明FLOAT 只是伪装的NUMBER

CREATE TABLE t (
  n1 NUMBER(*,1),  f1 FLOAT(1), f2 FLOAT(2), f3 FLOAT(3),
  n2 NUMBER(*,2),  f4 FLOAT(4), f5 FLOAT(5), f6 FLOAT(6)
);
INSERT INTO t VALUES (1/3, 1/3, 1/3, 1/3, 1/3, 1/3, 1/3, 1/3);

SELECT n1, f1, f2, f3 FROM t;
  0.3 0.3 0.3 0.3

SELECT DUMP(n1), DUMP(f1), DUMP(f2), DUMP(f3) FROM t;
  Typ=2 Len=2: 192,31
  Typ=2 Len=2: 192,31
  Typ=2 Len=2: 192,31
  Typ=2 Len=2: 192,31

SELECT n2, f4, f5, f6 FROM t;
  0.33 0.33 0.33 0.33

SELECT DUMP(n2), DUMP(f4), DUMP(f5), DUMP(f6) FROM t;
  Typ=2 Len=2: 192,34
  Typ=2 Len=2: 192,34
  Typ=2 Len=2: 192,34
  Typ=2 Len=2: 192,34

但请注意,从 Float 的精度位到 Number 的十进制数字的转换因子不是 3,而是 3.32 左右。确切地说digits = ceil(bits / log(2,10).

【讨论】:

  • 谢谢,那个页面好多了。所以,只是为了确保FLOAT(p) 没有使用NUMBER 的直接等效项?似乎甲骨文论坛和互联网上有很多不良信息,人们将数字、浮点数、binary_float 和“浮点数”相互混淆。
  • 那么float的比例是多少?
  • @JavaTechnical “无法指定比例,但从数据中解释”(Oracle 文档,请参见上面的链接)
  • @wolφi 这意味着比例可以是任意的,但总位数必须是 126。我说的对吗?
  • @JavaTechnical 不,您根本无法指定比例。不,bits 的数量,而不是数字,必须在 1 到 126 之间。我将编辑答案并添加一些示例。
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 2017-02-16
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2015-04-17
  • 2015-11-15
相关资源
最近更新 更多