2013-07-02 29 views
5

什麼是Oracle 10g中的FLOAT數據類型,它與NUMBER有什麼關係?FLOAT如何映射/關聯到Oracle 10g中的NUMBER?

唯一的參考,我可以找到Oracle文檔中浮子在此頁面的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類型,甲骨文語法支持以下數字數據類型:

當我說「語法支持」時,我的意思是一個CREATE語句可以使用這些數據類型,但在它們的封面下它們都是真正的NUMBER類型。 ...

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

什麼我不明白是怎麼映射到數字。

NUMBER(p)讓我爲0好像FLOAT(p)是映射NUMBER(decimal p, *)指定的精度,但規模默認值,也就是固定的精度,但可變的規模,這是不是號碼類型,據我可以告訴允許。

因此,FLOAT不僅僅是一個別名,還提供NUMBER本身不提供的行爲?

+0

我沒有方便的Oracle實例來檢查,但如果我記錯在封裝SYS.STANDARD如定義FLOAT NUMBER的子類型。(在Oracle中**大多數**數字類型都是NUMBER的子類型,我相信BINARY_FLOAT和BINARY_DOUBLE是極少數例外之一,PLS_INTEGER可能是另外一種,但我不確定 - 檢查SYS.STANDARD)。 –

+0

@BobJarvis是的,它說'子類型FLOAT是NUMBER; - NUMBER(126)',但它又說'子類型BINARY_FLOAT是NUMBER;'... –

回答

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位十進制二進制精密

編輯 控釋片的一些例子表明,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 

要小心,雖然,從浮動的精度位數字的小數位數的轉換系數是不是3,而是圍繞3.32。確切位數 =小區(比特 /日誌(2,10)。

+0

謝謝,那個頁面好多了。那麼,爲了確保'FLOAT(p)'沒有使用'NUMBER'的直接等價物?一般來說,在oracle論壇和互聯網上有很多不好的信息,人們會把數字,浮點數,二進制浮點數和「浮點數」混淆在一起。 – takteek

+0

那麼浮動的比例是多少? – user12458

+0

@JavaTechnical「Scale不能被指定,但是從數據中被解釋」(Oracle文檔,參見上面的鏈接) –