Oracle number類型詳解

簡介

Oracle的number類型比較複雜,很多限制,但是掌握一點小技巧就能輕鬆搞定。

oracle number

基本說明

number(precision,scale)

  1. precision表示數字中的有效位,從左邊第一個不爲0的數算起,小數點和負號不計入有效位數
  2. precision的取值範圍是[1,38]
  3. precision默認值爲38,number等價於number(38)
  4. scale大於0,表示數字精確到小數點右邊的位數,number(2,3)表示精確到小數點左邊3位
  5. scale小於0,表示數字取捨到小數點左邊的位數,number(3,-2)表示四色五人到百位,123,變爲100
  6. scale的取值範圍是[-84,127]
  7. scale默認值爲0
  8. number整數部分允許的最大長度爲precision-scale
  9. number整數部分的長度 大於 precision-scale 時出錯,例如number(3,2)就不能存12.34,因爲精度不夠
  10. number小數部分的長度 大於 scale時,就會對小數部分多出來的位數四捨五入,例如number(3,1),存儲3.1415的時候就會存3.1
  11. scale爲負數時,對小數點左邊的sacle個數字進行四捨五入,如number(5,-3),存儲1234567.89,存儲值爲1235000,可以看到0沒有佔有有效位

違背第一直覺的項來了:

scale 大於 precision 時, precision表示小數點後第scale位向左最多可以有多少位數字,如果大於p則出錯錯,小數點後s位向右的數字四捨五入。

換個思路,換個說法,也許就好理解了。scale大於precision的時候,小數部分的精度大於整個數的精度只可能是一種情況,這個數就是小數,並且多半是0.00..xx這種。

例如,number(2,3),小數部分有3位,但是數據只能精確兩位,那就只能存0.012這種,只需存12兩位有效數字,如果是0.12這種就存不了,因爲0.12三位有效數字就是0.120,存不了這麼多位。

容易出錯情況

  1. number(8),存儲1234567.89是沒有問題,因爲沒有定義小數位,小數位被捨棄合理
  2. number(6),不能存儲1234567.89,雖然沒有存儲小數位,但是整數位也不夠
  3. number(9,3),不能存儲1234567.89,雖然精度是9位,但是定義了小數位佔了3位,只有6位整數位,1234567有7位
  4. number(7,2),不能存儲1234567.89,沒啥好說的,精度不夠,7位不足以存儲9位數字
  5. number(2,3),不能存儲0.23,小數部分有3位有效數字,0.230,精度只有2位,不足以存儲

Number與MySQL數據類型

MySQL數據類型 字節大小 範圍-有符號 範圍-無符號 oracle number
tinyint 1 bytes (-128,127) (0,255) number(3)
smallint 2 bytes (-32 768,32 767) (0,65 535) number(5)
mediumint 3 bytes (-8 388 608,8 388 607) (0,16 777 215) number(8)
integer 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) number(10)
bigint 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) number(20)

Oracle的number和MySQL的decimal非常像,但是在數據類型上區分的更細,能更好的利用存儲空間,提高性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章