2013-07-02 16 views
5

Was ist der FLOAT-Datentyp in Oracle 10g und in welcher Beziehung steht er zu NUMBER?Wie hängt FLOAT NUMBER in Oracle 10g ab?

Die einzige Referenz, die ich FLOAT in der Oracle-Dokumentation finden kann, ist im Abschnitt BINARY_DOUBLE dieser Seite: http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i140621 Es scheint anzuzeigen, dass es eine Gleitkommazahl speichert und Sie Bits der Genauigkeit angeben können, aber es nicht t Referenzieren Sie den NUMBER-Typ. Die 11g Docs erwähnen FLOAT überhaupt nicht.

Das Buch "Expert Oracle Database Architecture: Oracle Database 9i, 10g und 11g Programmiertechniken und Lösungen, Second Edition", sagen:

Neben den NUMBER, BINARY_FLOAT und BINARY_DOUBLE Typen, Oracle syntaktisch unterstützt die folgenden numerischen Datentypen:

Wenn ich sage "syntaktisch unterstützt", meine ich, dass eine CREATE-Anweisung diese Datentypen verwenden kann, aber unter den Abdeckungen sind sie alle wirklich der NUMBER-Typ. ...

  • FLOAT (p): Ordnet dem NUMBER-Typ zu.

Was ich nicht verstehe, ist, wie es NUMBER abbildet.

NUMBER(p) ermöglicht es mir, Standardwerte Präzision, aber die Skala angeben, auf 0 Es ist wie FLOAT(p) scheint, ist Mapping NUMBER(decimal p, *), das heißt, feste Präzision, sondern variable Skala, die die Anzahl Typ erlaubt, soweit ich kann nicht sagen, etwas ist.

Also, FLOAT ist nicht nur ein Alias, sondern bietet auch ein Verhalten, das NUMBER selbst nicht bietet?

+0

Ich habe nicht eine Oracle-Instanz praktisch zu überprüfen, aber wenn ich mich richtig erinnere FLOAT definiert ist in dem Paket SYS.STANDARD als ein Subtyp von NUMMER.(In Oracle ** die meisten ** numerischen Typen sind Subtypen von NUMBER. Ich glaube, dass BINARY_FLOAT und BINARY_DOUBLE eine der wenigen Ausnahmen sind. PLS_INTEGER könnte ein anderer sein, aber ich bin mir nicht sicher - überprüfen Sie SYS.STANDARD). –

+0

@BobJarvis ja, es heißt 'Subtyp FLOAT ist NUMMER; - NUMBER (126) ', aber dann wieder heißt es auch: 'Subtyp BINARY_FLOAT ist NUMBER;' ... –

Antwort

7

Die Dokumentation in 10g ist ein wenig unklar. Es hat sich verbessert einiges von 11,1 ab:

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

Zusammengefasst FLOAT die gleiche wie NUMBER ist, mit zwei Unterschieden

  1. FLOAT kann die Skala angeben
  2. In FLOAT, die Genauigkeit wird in binären Bits angegeben, in NUMBER in Dezimalziffern, so bedeutet FLOAT(126) 126 Bits der Genauigkeit, NUMBER(38) bedeutet 38 Dezimal di gits Präzision

EDIT Einige Beispiele zeigen, dass ein FLOAT ist nur ein NUMBER in der Verkleidung.

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 

Vorsicht, der Umrechnungsfaktor von Float-Präzisions-Bits Anzahl der Dezimalstellen aber ist nicht 3, sondern um 3.32. Um genau zu sein Ziffern = ceil (Bits/log (2,10).

+0

Danke, diese Seite ist viel besser. Also, nur um sicher zu sein, 'FLOAT (p)' hat keine direkte Entsprechung mit 'NUMBER'? Es scheint, als gäbe es eine Menge schlechter Informationen in den Orakelforen und im Internet, wo Leute Zahlen, Float, binary_float und "Gleitkommazahlen" miteinander verwechseln. – takteek

+0

Was ist dann die Skala für float? – user12458

+0

@JavaTechnical "Skalierung kann nicht angegeben werden, wird aber aus den Daten interpretiert" (Oracle-Dokumentation, siehe Link oben) –