天天看點

ORACLE 中NUMBER類型預設的精度和Scale問題

ORACLE 中NUMBER類型預設的精度和Scale問題

<b>當然文檔沒有錯誤</b>,文檔應該是指在定義字段資料類型為NUMBER時,指定了NUMBER類型的P值,但是沒有指定S的值,那麼Scale預設就是0,如下測試所示,當時應該是我自己沒有完全了解文檔意思,當然文檔也有誤導的嫌疑。

ORACLE 中NUMBER類型預設的精度和Scale問題

當在指定字段類型為NUMBER時,如果P和S都不指定,那麼P和S又是什麼值呢?今天特意實驗驗證了一下,具體實驗過程如下:

如上所示,當我插入上面兩條記錄後,發現如果不指定p和s,NUMBER類型,此時的Scale至少是9,我們繼續測試,插入下面資料

如下所示,此時可以看到Scale的值33了,那麼Scale的值是否可以繼續變大呢?

ORACLE 中NUMBER類型預設的精度和Scale問題

如下截圖所示,插入的記錄為12.123456789123456789123456789123456789123,但是顯示的值為12.123456789123456789123456789123456789,總共為38位,由于格式化列的緣故,可能導緻部分小數位沒有顯示,

ORACLE 中NUMBER類型預設的精度和Scale問題

我們繼續測試,調整格式化列,我們發現值變為了12.12345678912345678912345678912345678912,總共40位了,Scale的值為38了。這個是為什麼呢?不是數字精度為38,意味着最多是38位嗎?

ORACLE 中NUMBER類型預設的精度和Scale問題

繼續其它測試,我們發現Sacle的值會随着小數點前面數字的變化而變化,如下所示:

ORACLE 中NUMBER類型預設的精度和Scale問題

從上面測試可以看出,Scale的值是變化的,跟資料值有關系,目前看來,小數點前的數字位數和小數點後的數字位數相加為40(有時候又是39),為了測試是否這個規律,我特意用下面案例測試一下

ORACLE 中NUMBER類型預設的精度和Scale問題

這個問題糾結了很久,不明白為什麼是39或40,後面在Oracle Database SQL Reference 10g Release 2終于找到解釋了,如下所示:

p is the precision, or the total number of significant decimal digits, where the most

significant digit is the left-most nonzero digit, and the least significant digit is the

right-most known digit. Oracle guarantees the portability of numbers with

precision of up to 20 base-100 digits, which is equivalent to 39 or 40 decimal digits

depending on the position of the decimal point.

p是精度,或是有效十進制數的總位數。最大的有效數字是最左邊的非零數字,而最小有效位是最右邊的數字。 Oracle保證數字的可移植性

精度高達20 base-100 digits,相當于39位或40位十進制數字,取決于小數點的位置。