5

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 本身不提供的行为?

4

1 回答 1

7

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

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

总之,FLOAT与 相同NUMBER,但有两个不同之处

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

编辑 一些例子表明 aFLOAT只是NUMBER变相的 a 。

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 左右。确切地说,数字= ceil( bits / log(2,10)。

于 2013-07-02T02:19:04.587 回答