oracle number(p,s)数据类型
来源:互联网 发布:tensorflow epoch 编辑:程序博客网 时间:2024/05/29 16:28
oracle的number类型是oracle的内置类型之一,是oracle的最基础数值数据类型。在9iR2及其以前的版本中只支持一种适合存储数值数据的固有数据类型,在10g以后,才出现了两种新的数值类型。
oracle number类型能以极大的精度存储数值,具体来说,精度可达38位。其底层数据格式类似于一种“封包小数”表示,这个在我的上篇文章中已经做了阐述。oracle number类型是一种变长格式,长度0~22个字节,是目前最为常用的数值数据类型。
number类型的语法很简单:number(p,s):
p:精度位,precision,是总有效数据位数,取值范围是38,默认是38,可以用字符*表示38。
s:小数位,scale,是小数点右边的位数,取值范围是-84~127,默认值取决于p,如果没有指定p,那么s是最大范围,如果指定了p,那么s=0。
很多人对这里p和s的含义搞不清楚,以为可以存储p个整数,s个小数。其实完全不是这样的,number类型的p和s,与其底层存储完全没有关系,根本不会影响数据在磁盘上如何存储,它只会影响允许哪些值以及数值如何舍入,你可以认为其是对数据的“编辑”。
简单的说,精度位p表示数值最多能有多少个有效数字,而小数位s表示最多能有多少位小数。换句话说,p表示一共有多少位有效数字(即小数点左边最多有p-s位有效数字),s表示小数点右边有s位有效数字。如number(5,2)类型的数据,就表示小数点左边最多有3位有效数字,右边最多有2位有效数字,加起来就是最多有5位有效数字,超过这个范围的数字就不能正确的存储下来。
我们先模拟,精度位p完全正确的情况。
15:28:54 SQL> create table t (a number(5,2));
Table created.
Elapsed: 00:00:00.01
15:28:57 SQL> insert into t values(123.456);
1 row created.
Elapsed: 00:00:00.00
15:29:00 SQL> commit;
Commit complete.
Elapsed: 00:00:00.01
15:29:06 SQL> select * from t;
A
----------
123.46
Elapsed: 00:00:00.00
可以看到数字被四舍五入了,一共只能有p=5位有效数字,小数点右边最多只能存入s=2位有效数字,s对要存入的数据“123.456”做了四舍五入的“编辑裁剪”。
15:32:20 SQL> create table t1 (a number(5,-2));
Table created.
Elapsed: 00:00:00.01
15:34:01 SQL> insert into t1 values(123.45);
1 row created.
Elapsed: 00:00:00.00
15:34:19 SQL> insert into t1 values(12345.45);
1 row created.
Elapsed: 00:00:00.00
15:34:30 SQL> commit;
Commit complete.
Elapsed: 00:00:00.00
15:34:32 SQL> select * from t1;
A
----------
100
12300
Elapsed: 00:00:00.01
可以看到,当s<0时,其就表示小数点左边最多能存入s=-2的绝对值2位有效数字,其实还是右边s位(s=-2<0时反向变反),s对存入的数据“123.45”和“12345.45”都做了四舍五入的“编辑裁剪”得到number(5,-2)形式的“100”“12300”。
下面我们接着演示精度位p为不正确的情况。
15:38:28 SQL> create table t2(a number(5,2));
Table created.
Elapsed: 00:00:00.01
15:39:21 SQL> insert into t2 values(1234.56);
insert into t2 values(1234.56)
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
Elapsed: 00:00:00.01
15:39:35 SQL> create table t3(a number(5,-2));
Table created.
Elapsed: 00:00:00.01
15:40:16 SQL> insert into t3 values(12345678.9);
insert into t3 values(12345678.9)
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
Elapsed: 00:00:00.01
可以看到,上面的2种插入都失败了,因为精度为p=5,s=2时,表示小数点左边最多有p-s位,那么第一种情况最多有是5-2=3位,而实际上有4位故出错,第二种情况是最多有5-(-2)=7位,而实际上有8位故出错。
通过上面的解释,相信已经很明白number(p,s)中p和s的含义了,它们不影响底层数据的存储,而只影响某个数字能否正确存入number(p,s)类型的列中(oracle会根据s来裁剪此数据,保证有效数字有p位,精确到小数点右边s位)。
转自:http://hi.baidu.com/chenchendf/blog/item/8fc7302d2fd67538359bf7cc.html
1>.NUMBER类型细讲:
Oracle number datatype 语法:NUMBER[(precision [, scale])]
简称:precision --> p
scale --> s
NUMBER(p, s)
范围: 1 <= p <=38, -84 <= s <= 127
保存数据范围:-1.0e-130 <= number value < 1.0e+126
保存在机器内部的范围: 1 ~ 22 bytes
有效为:从左边第一个不为0的数算起的位数。
s的情况:
s > 0
精确到小数点右边s位,并四舍五入。然后检验有效位是否 <= p。
s < 0
精确到小数点左边s位,并四舍五入。然后检验有效位是否 <= p + |s|。
s = 0
此时NUMBER表示整数。
eg:
Actual Data Specified As Stored As
----------------------------------------
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(4,2) exceeds precision (有效位为5, 5 > 4)
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5) .01234 (有效位为4)
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error (有效位为5+2 > 6)
1234.9876 NUMBER(6) 1235 (s没有表示s=0)
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error (有效位为8 > 7)
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error (有效位为10 > 9)
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error (0.10000, 有效位为5 > 4)
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
转自:http://unix-cd.com/vc/www/16/2007-11/9751.html
- oracle number(p,s)数据类型
- oracle number(p,s)数据类型
- 转:oracle number(p,s)数据类型
- oracle number(p,s)
- oracle数据库--数据类型number(p,s)的使用详解
- ORACLE的Number(p,s)
- Oracle中的NUMBER(P,S)
- oracle 中的数据类型:number(p,s) 和date类型(日期型数据)
- oracle的Number(p,s)的意义
- oracle的Number(p,s)的意义
- oracle的Number(p,s)的意义
- oracle的Number(p,s)的意义
- oracle number类型 p、s参数说明
- 【Oracle】Number(p,s)的含义
- Oracle中Number(p,s)的意义
- Oracle中Number(p,s)的意义
- Oracle中number(p,-s)的意思
- Oracle笔记——number(p,s)
- [转]C#委托和事件
- 新的起点出发
- cron 表达式
- 根据视频地址生成相应的emabed标签
- fckeditor内容多了一个逗号
- oracle number(p,s)数据类型
- 安装程序找不到office.zh-cn/*解决方案
- Hello World ---- 各种编程语言中
- (PS)かまいたちの夜•特別篇 汉化笔记 十
- flexigrid.js 右键菜单以及文本框
- 主题:财务指标说明-(管理驾驶舱必备知识之一)
- flexigrid.js 右键菜单以及文本框
- flexigrid.js 右键菜单以及文本框
- 虚拟机与主机共享文件夹设置