【NUMBER】Oracle的NUMBER資料型別特點

secooler發表於2010-11-13
Oracle的NUMBER資料型別內部使用科學計數法以可變長度格式來儲存資料。使用1B儲存指數,而另外20B(可變)用於儲存該數字剩下的部分。這種儲存模式使得NUMBER資料型別可以表示的精度為38位。簡單的對Oracle數字型別的儲存特點進行簡單探索。

1.確定數字所佔位元組的大小
可以使用vsize函式獲得儲存數字時佔用的位元組。
SQL> select vsize(100) from dual;

VSIZE(100)
----------
         2

表示在儲存數字100時將會使用2B空間進行儲存,其中1B用於儲存數字,另外1B用於儲存指數。

2.使用dump獲取數字的具體儲存資訊
SQL> select dump(100) from dual;

DUMP(100)
------------------
Typ=2 Len=2: 194,2

3.Oracle NUMBER型別定義的不同形式
Oracle是使用精度(precision)和範圍(scale)的方式來定義NUMBER資料型別的。如果使用特定的精度定義NUMBER,當超過所定義的精度時將會丟擲“ORA-01438: value larger than specified precision allowed for this column”報錯。具體舉例如下。

1)定義精度為6,範圍為2的欄位進行測試
SQL> drop table t purge;

Table dropped.

SQL> create table t (x number(6,2));

Table created.

2)符合精度和範圍時,成功插入
SQL> insert into t values(1234.56);

1 row created.

SQL> select * from t;

         X
----------
   1234.56

3)符合精度,但超出範圍時,會四捨五入
SQL> insert into t values(123.456);

1 row created.

SQL> select * from t;

         X
----------
   1234.56
    123.46

可見數字“123.456”已被四捨五入為“123.46”。

4)當超出精度時,將丟擲ORA-01438錯誤
SQL> insert into t values(12345.67);
insert into t values(12345.67)
                     *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

有關數字型別的精度的描述請參見文章《【NUMBER】有關Oracle NUMBER型別定義中precision和scale的測試和總結》(http://space.itpub.net/519536/viewspace-557312)。

5)當定義數字型別時未給出範圍的定義時,表示以整數形式儲存
SQL> drop table t purge;

Table dropped.

SQL> create table t (x number(1));

Table created.

SQL> insert into t values (1.42312312321);

1 row created.

SQL> select * from t;

         X
----------
         1

SQL> insert into t values (1.52342341234);

1 row created.

SQL> select * from t;

         X
----------
         1
         2

這裡同樣體現了四捨五入的原則。

4.小結
只要掌握了數字型別精度(precision)和範圍(scale)的含義,便可以很好地理解Oracle NUMBER型別。

Good luck.

secooler
10.11.13

-- The End --

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

相關文章