簡介
Oracle的number類型比較複雜,很多限制,但是掌握一點小技巧就能輕鬆搞定。
基本說明
number(precision,scale)
- precision表示數字中的有效位,從左邊第一個不爲0的數算起,小數點和負號不計入有效位數
- precision的取值範圍是[1,38]
- precision默認值爲38,number等價於number(38)
- scale大於0,表示數字精確到小數點右邊的位數,number(2,3)表示精確到小數點左邊3位
- scale小於0,表示數字取捨到小數點左邊的位數,number(3,-2)表示四色五人到百位,123,變爲100
- scale的取值範圍是[-84,127]
- scale默認值爲0
- number整數部分允許的最大長度爲precision-scale
- number整數部分的長度 大於 precision-scale 時出錯,例如number(3,2)就不能存12.34,因爲精度不夠
- number小數部分的長度 大於 scale時,就會對小數部分多出來的位數四捨五入,例如number(3,1),存儲3.1415的時候就會存3.1
- 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,存不了這麼多位。
容易出錯情況
- number(8),存儲1234567.89是沒有問題,因爲沒有定義小數位,小數位被捨棄合理
- number(6),不能存儲1234567.89,雖然沒有存儲小數位,但是整數位也不夠
- number(9,3),不能存儲1234567.89,雖然精度是9位,但是定義了小數位佔了3位,只有6位整數位,1234567有7位
- number(7,2),不能存儲1234567.89,沒啥好說的,精度不夠,7位不足以存儲9位數字
- 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非常像,但是在數據類型上區分的更細,能更好的利用存儲空間,提高性能。