5

Oracle 10g の FLOAT データ型とは何ですか? また、NUMBER とどのように関係していますか?

Oracle のドキュメントで FLOAT を参照できる唯一の参照は、このページの BINARY_DOUBLE セクションにあります。浮動小数点数を格納し、精度のビットを指定できるようにしますが、NUMBER 型を参照しません。11g のドキュメントでは、FLOAT についてまったく言及されていません。

本「Expert Oracle Database Architecture: Oracle Database 9i, 10g, and 11g Programming Techniques and Solutions, Second Edition」には、次のように書かれています。

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、2 つの違いがあります。

  1. FLOAT縮尺は指定できません
  2. ではFLOAT、精度は 2 進ビットで、NUMBERでは 10 進数で示されているため、FLOAT(126)126 ビットの精度をNUMBER(38)意味し、10 進数で 38 桁の精度を意味します。

EDIT いくつかの例は、 aFLOATが単なる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 の 10 進数への変換係数は 3 ではなく、約 3.32 であることに注意してください。正確には数字= ceil(ビット/ ログ (2,10) です。

于 2013-07-02T02:19:04.587 に答える