Oracle number類型使用解讀
簡(jiǎn)介
Oracle的number類型比較復(fù)雜,很多限制,但是掌握一點(diǎn)小技巧就能輕松搞定。

基本說明
number(precision,scale)
- precision表示數(shù)字中的有效位,從左邊第一個(gè)不為0的數(shù)算起,小數(shù)點(diǎn)和負(fù)號(hào)不計(jì)入有效位數(shù)
- precision的取值范圍是[1,38]
- precision默認(rèn)值為38,number等價(jià)于number(38)
- scale大于0,表示數(shù)字精確到小數(shù)點(diǎn)右邊的位數(shù),number(2,3)表示精確到小數(shù)點(diǎn)左邊3位
- scale小于0,表示數(shù)字取舍到小數(shù)點(diǎn)左邊的位數(shù),number(3,-2)表示四色五人到百位,123,變?yōu)?00
- scale的取值范圍是[-84,127]
- scale默認(rèn)值為0
- number整數(shù)部分允許的最大長(zhǎng)度為precision-scale
- number整數(shù)部分的長(zhǎng)度 大于 precision-scale 時(shí)出錯(cuò),例如number(3,2)就不能存12.34,因?yàn)榫炔粔?/li>
- number小數(shù)部分的長(zhǎng)度 大于 scale時(shí),就會(huì)對(duì)小數(shù)部分多出來的位數(shù)四舍五入,例如number(3,1),存儲(chǔ)3.1415的時(shí)候就會(huì)存3.1
- scale為負(fù)數(shù)時(shí),對(duì)小數(shù)點(diǎn)左邊的sacle個(gè)數(shù)字進(jìn)行四舍五入,如number(5,-3),存儲(chǔ)1234567.89,存儲(chǔ)值為1235000,可以看到0沒有占有有效位
違背第一直覺的項(xiàng)來了:
scale 大于 precision 時(shí), precision表示小數(shù)點(diǎn)后第scale位向左最多可以有多少位數(shù)字,如果大于p則出錯(cuò)錯(cuò),小數(shù)點(diǎn)后s位向右的數(shù)字四舍五入。
換個(gè)思路,換個(gè)說法,也許就好理解了。scale大于precision的時(shí)候,小數(shù)部分的精度大于整個(gè)數(shù)的精度只可能是一種情況,這個(gè)數(shù)就是小數(shù),并且多半是0.00…xx這種。
例如,number(2,3),小數(shù)部分有3位,但是數(shù)據(jù)只能精確兩位,那就只能存0.012這種,只需存12兩位有效數(shù)字,如果是0.12這種就存不了,因?yàn)?.12三位有效數(shù)字就是0.120,存不了這么多位。
容易出錯(cuò)情況
- number(8),存儲(chǔ)1234567.89是沒有問題,因?yàn)闆]有定義小數(shù)位,小數(shù)位被舍棄合理
- number(6),不能存儲(chǔ)1234567.89,雖然沒有存儲(chǔ)小數(shù)位,但是整數(shù)位也不夠
- number(9,3),不能存儲(chǔ)1234567.89,雖然精度是9位,但是定義了小數(shù)位占了3位,只有6位整數(shù)位,1234567有7位
- number(7,2),不能存儲(chǔ)1234567.89,沒啥好說的,精度不夠,7位不足以存儲(chǔ)9位數(shù)字
- number(2,3),不能存儲(chǔ)0.23,小數(shù)部分有3位有效數(shù)字,0.230,精度只有2位,不足以存儲(chǔ)
Number與MySQL數(shù)據(jù)類型
| MySQL數(shù)據(jù)類型 | 字節(jié)大小 | 范圍-有符號(hào) | 范圍-無符號(hào) | 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非常像,但是在數(shù)據(jù)類型上區(qū)分的更細(xì),能更好的利用存儲(chǔ)空間,提高性能。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle SQL語句實(shí)現(xiàn)數(shù)字四舍五入取整
本文介紹Oracle中一些對(duì)數(shù)字的常用操作,包括向上向下去整、四舍五入、保留N位小數(shù)等操作,希望對(duì)大家有所幫助。2016-05-05
ORA-00947:Not enough values (沒有足夠的值)的深入分析
本篇文章是對(duì)ORA-00947:Not enough values (沒有足夠的值)的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Oracle高級(jí)隊(duì)列(Advanced Queue)簡(jiǎn)單實(shí)例
這篇文章主要介紹了Oracle高級(jí)隊(duì)列(Advanced Queue)簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04
MS Server和Oracle中對(duì)NULL處理的一些細(xì)節(jié)差異
SQL Server和Oracle中對(duì)插入數(shù)據(jù)值包含空的處理有所差異,在SQL Server中,我們可以把表字段設(shè)計(jì)為非空,但我們?nèi)匀豢梢酝ㄟ^下面語句執(zhí)行插入操作2009-06-06
Windows Sever 2012下Oracle 12c安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows Sever 2012下Oracle 12c安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
OB Oracle系統(tǒng)視圖權(quán)限導(dǎo)致的故障解決案例
在 Oracle 和 OB Oracle 租戶下調(diào)用存儲(chǔ)過程時(shí),兩者表現(xiàn)并不一致,導(dǎo)致獲取到的 SQL 文本拼接不完整,影響到了業(yè)務(wù)側(cè)的功能測(cè)試,本文將針對(duì)這個(gè)問題進(jìn)行相關(guān)的測(cè)試和驗(yàn)證2023-10-10

