[20160828]number型別.txt

lfree發表於2016-08-29

[20160828]number型別.txt

--昨天看了一個連結http://www.cnblogs.com/kerrycode/p/4427352.html,感覺有點不對,上班測試看看。

1.環境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create table tx ( a number,b number(38,2) ,c number(38));
insert into tx values (1/3,1/3,1/3);
commit ;


SCOTT@book> select * from tx;
         A          B          C
---------- ---------- ----------
.333333333        .33          0

2.測試:
set serveroutput on

DECLARE 
CURSOR c_test IS SELECT a,b,c FROM Tx;
c_row c_test%rowtype;
begin
   for c_row in c_test loop
        dbms_output.put_line('the result is a=' || c_row.a);
        dbms_output.put_line('the result is b=' || c_row.b);
        dbms_output.put_line('the result is c=' || c_row.c);
   end loop;
end;
/

the result is a=.3333333333333333333333333333333333333333
the result is b=.33
the result is c=0
PL/SQL procedure successfully completed.

SCOTT@book> @ &r/desc tx
           Name Null?    Type
           ---- -------- ----------------------------
    1      A             NUMBER
    2      B             NUMBER(38,2)
    3      C             NUMBER(38)

--很明顯我並沒有測試出作者的情況,實際上定義number,並不意味者精度是0.估計作者使用pl/sql的原因。

SCOTT@book> select dump(a,10) c80 ,dump(b,10) c30 ,dump(c,10) c20 from tx;
C80                                                                              C30                            C20
-------------------------------------------------------------------------------- ------------------------------ --------------------
Typ=2 Len=21: 192,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34    Typ=2 Len=2: 192,34            Typ=2 Len=1: 128

--你可以發現欄位a,長度是21,也就是在生產系統最好不要簡單的定義型別number,要加入整數部分長度的限制,避免一些運算導致字
--段佔用空間很大,最佳的方式準確的設定scale。

--另外我曾經在使用copy命令(sqlplus)時出現異常,可以參考連結:
http://blog.itpub.net/267265/viewspace-1257036/

--使用copy後丟失了小數點後面的資訊,資料型別number變成了number(38).

--總之最好不要簡單的定義型別是number,要寫成number(10) ,如果有精度需求加入number(10,3).

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2124132/,如需轉載,請註明出處,否則將追究法律責任。

相關文章