Oracle number类型详解
简介
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非常像,但是在数据类型上区分的更细,能更好的利用存储空间,提高性能。
</article>