2013-07-02 48 views
5

Loại dữ liệu FLOAT trong Oracle 10g là gì và nó có liên quan như thế nào với NUMBER?FLOAT map/liên quan đến NUMBER trong Oracle 10g như thế nào?

Tham chiếu duy nhất tôi có thể tìm thấy FLOAT trong tài liệu Oracle nằm trong phần BINARY_DOUBLE của trang này: http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i140621 Dường như chỉ ra rằng nó lưu trữ số dấu phẩy động và cho phép bạn chỉ định bit chính xác, nhưng không t tham chiếu loại NUMBER. Các tài liệu 11g không đề cập đến FLOAT cả.

Cuốn sách "Expert Oracle Kiến trúc Cơ sở dữ liệu: Oracle Database 9i, 10g và 11g Lập trình kỹ thuật và giải pháp, Second Edition" nói:

Ngoài SỐ, BINARY_FLOAT, và các loại BINARY_DOUBLE, Oracle cú pháp hỗ trợ các kiểu dữ liệu số sau đây:

Khi tôi nói "hỗ trợ cú pháp", tôi có nghĩa là câu lệnh CREATE có thể sử dụng các kiểu dữ liệu này, nhưng dưới bìa chúng thực sự là loại NUMBER. ...

  • FLOAT (p): Bản đồ cho loại NUMBER.

Những gì tôi không hiểu là như thế nào nó ánh xạ tối đa NUMBER.

NUMBER(p) cho phép tôi chỉ định độ chính xác nhưng tỷ lệ mặc định là 0. Có vẻ như FLOAT(p) được ánh xạ tới NUMBER(decimal p, *), nghĩa là độ chính xác cố định nhưng quy mô thay đổi không phải là loại NUMBER cho phép.

Vì vậy, FLOAT không chỉ là bí danh mà còn cung cấp hành vi mà NUMBER chính nó không cung cấp?

+0

Tôi không có một thể hiện của Oracle tiện dụng để kiểm tra, nhưng nếu tôi nhớ chính xác float được định nghĩa trong SYS.STANDARD gói như một loại phụ NUMBER.(Trong Oracle ** nhất ** kiểu số là các kiểu con của NUMBER. Tôi tin rằng BINARY_FLOAT và BINARY_DOUBLE là một trong số ít ngoại lệ cho điều này. PLS_INTEGER có thể là một kiểu khác nhưng tôi không chắc chắn - hãy kiểm tra SYS.STANDARD). –

+0

@BobJarvis có, nó nói 'sublope FLOAT là NUMBER; - NUMBER (126) ', nhưng sau đó một lần nữa nó cũng nói' subtype BINARY_FLOAT là NUMBER; '... –

Trả lời

7

Tài liệu trong 10g có một chút không rõ ràng. Nó đã được cải thiện khá nhiều từ 11.1 trở đi:

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

Nói tóm lại, FLOAT cũng giống như NUMBER, với hai sự khác biệt

  1. FLOAT không thể xác định quy mô
  2. Trong FLOAT, các độ chính xác được đưa ra trong bit nhị phân, trong NUMBER bằng chữ số thập phân, vì vậy FLOAT(126) có nghĩa là 126 bit chính xác, NUMBER(38) có nghĩa là 38 thập phân GITS chính xác

EDIT Một số ví dụ cho thấy một FLOAT chỉ là một NUMBER trong ngụy trang.

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 

Hãy cẩn thận, tuy nhiên, hệ số chuyển đổi từ bit chính xác phao để chữ số thập phân Số là không 3, nhưng khoảng 3,32. Để được chính xác chữ số = ceil (bit/log (2,10).

+0

Cảm ơn, trang đó tốt hơn nhiều. Vì vậy, để đảm bảo rằng 'FLOAT (p)' không có tương đương trực tiếp bằng 'NUMBER'? Nó có vẻ như có rất nhiều thông tin xấu trên các diễn đàn oracle và internet nói chung, nơi mọi người đang nhầm lẫn số, float, binary_float, và "số dấu chấm động" với nhau. – takteek

+0

Vậy quy mô cho phao là gì? – user12458

+0

@JavaTechnical "Quy mô không thể được chỉ định, nhưng được giải thích từ dữ liệu" (tài liệu Oracle, xem liên kết ở trên) –