Oracle类型number与PG类型numeric对比和转换策略
Oracle 11g
number 任意精度数字类型
http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT313
存储数据的范围
正数:1 x 10-130 to 9.99...9 x 10125 ,数据精度为38个有效数字
负数:-1 x 10-130 to 9.99...99 x 10125 ,数据精度为38个有效数字
零:0
无穷大:仅仅只可以从oracle 5中导入
描述
标度scale代表小数部分的数字位数,scale∈[-84,127],s缺省为0;
精度precision 代表所有数字的位数,precision∈[1,38],p缺省为最大限度内的任意值。
一般的精度可以大于等于标度,oracle中精度也可以小于标度,如numeri(3,6),该字段只能插入小于0.001的值,即0.0009,0.0008等等,小数点后尾数超出标度的位数将会四舍五入省去。
几个常见形式
Number 或者Number(*), (user_tab_column查询结果中data_precision =null,data_scale=null),此时可以存储极限内任意Precision和scale的值。
Number(*,scale), (user_tab_column查询结果中data_precision=null,data_scale=scale)此时可以存储极限内任意precision的值;
Number(precision), 此时scale缺省为0,等价于number(precision,0);
Number(precision,scale), precision∈[1,38],scale∈[-84,127]。
例子
| Input Data |
Specified As |
Stored As |
|
7,456,123.89 |
NUMBER |
7456123.89 |
|
7,456,123.89 |
NUMBER(*,1) |
7456123.9 |
|
7,456,123.89 |
NUMBER(9) |
7456124 |
|
7,456,123.89 |
NUMBER(9,2) |
7456123.89 |
|
7,456,123.89 |
NUMBER(9,1) |
7456123.9 |
|
7,456,123.89 |
NUMBER(6) |
(not accepted, exceeds precision) |
|
7,456,123.89 |
NUMBER(7,-2) |
7456100 |
我的个人测试例子(oracle Release
10.2.0.1.0)如下,得出小结论:number最多能存储126位整数(超出126位后会溢出报错),能准确存储最高40位的整数(大于40切小于等于126的整数,超出40位的部分四舍五入后补为0),当有整数和小数时,整数部分最多能准确存储38位。
SQL> create table test0(id int,num number); 表已创建。 SQL> insert into test0 values(1,123456789123456789123456789123456789123456789123
456789123456789123456789123456789123456789123456789123456789123456789123456789);--126
已创建 1 行。
提交完成。 SQL> insert into test0 values(2,123456789123456789123456789123456789123456789123
4567891234567891234567891234567891234567891234567891234567891234567891234567891)
;--127
insert into test0 values(2,12345678912345678912345678912345678912345678912345678
91234567891234567891234567891234567891234567891234567891234567891234567891)
*
第 1 行出现错误:
ORA-01426: 数字溢出 SQL> insert into test0 values(3,1234567891234567891234567891234567891234);--40
已创建 1 行。
提交完成。 SQL> insert into test0 values(4,12345678912345678912345678912345678912345);--41
已创建 1 行。
提交完成。 SQL> insert into test0 values(6,1234567891234567891234567891234567891234.567);--【40,3】
已创建 1 行。
提交完成。 SQL> insert into test0 values(7,123456789123456789123456789123456789123.4567);--【39,4】
已创建 1 行。
提交完成。 SQL> insert into test0 values(8,12345678912345678912345678912345678912.34567);--【38,5】
已创建 1 行。
提交完成。 SQL> select * from test0; ID NUM
---------- ----------
1 1.235E+125
3 1.2346E+39
4 1.2346E+40
6 1.2346E+39
7 1.2346E+38
8 1.2346E+37
通过JDBC获取到的数据是:
System.out.println(rs.getInt(1)+","+rs.getBigDecimal(2)+","+rs.getBigDecimal(2) .toString().length()); print
-----------------------------------------
1,123456789123456789123456789123456789123500000000000000000000000000000000000000000000000000000000000000000000000000000000000000,126
3,1234567891234567891234567891234567891234,40
4,12345678912345678912345678912345678912300,41
6,1234567891234567891234567891234567891235,40
7,123456789123456789123456789123456789123,39
8,12345678912345678912345678912345678912.35,41
Postgresql 9.3
Numeric 任意精度数字类型
http://www.postgresql.org/docs/9.3/interactive/datatype-numeric.html#DATATYPE-NUMERIC-TABLE
存储空间:变长
描述:用户声明精度,位数精确。
范围:小数点以前最多 131072位,小数点以后最多16383 位。
标度(scale):是小数部分的位数,scale>=0
精度(precision):是全部数据位的数目,也就是小数点两边的位数总和。
仅支持精度>=标度。
例子:数字 23.5141 的精度为 6 而标度为 4 。可以认为整数的标度scale为零。
常见形式:
numeric 字段的最大精度和最大标度都是可以配置的。要声明一个字段的类型为 numeric ,可以用下面的语法:
NUMERIC(precision, scale),其中precision>0,scale>=0。
NUMERIC(precision),此时即scale缺省为0,即等价于NUMERIC(pre3cision,0)。
NUMERIC不带任何精度与标度的声明,则创建一个可以存储一个直到实现精度上限的任意精度和标度的数值,一个这样类型的字段将不会把输入数值转化成任何特定的标度,而带有标度声明的 numeric 字段将把输入值转化为该标度。
我的个人测试例子(postgresql9.3.4)如下,得出小结论:numeric不同于oracle的number,numeric能准确存储126位,甚至更高位的数字。
jnggzy=> create table ttt1(id int, num numeric);
CREATE TABLE jnggzy=> insert into ttt1 values(1,123456789123456789123456789123456789123456789
12345678912345678912345678912345678912345678912345678912345678912345678912345678
9);---126
INSERT 0 1 jnggzy=> insert into ttt1 values(1,123456789123456789123456789123456789123456789
12345678912345678912345678912345678912345678912345678912345678912345678912345678
9123456789);---135
INSERT 0 1 jnggzy=> insert into ttt1 values(3,123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789.123456789);--【135,9】
INSERT 0 1 jnggzy=> select * from ttt1;
id | num ----+---------------------------------------------------------------------------
1 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789
1 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789
3 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789.123456789
(3 行记录)
Oracle类型number与PG类型numeric对比和转换策略的更多相关文章
- 对于Oracle中Number类型的字段映射成Java中的具体类型的问题
我在Oracle中给一个用户Id字段设置为Number类型,使用JDBC在完成ORM的时候,以为其可以自动转换为Integer,因为我的POJO类id使用的就是Integer.但事实是,我在测试的时候 ...
- EF:oracle的number类型映射为C#的boolean类型
一开始用下面的方法映射, Property(p => p.IsFixed).HasColumnName("IS_FIXED").HasColumnType("num ...
- oracle中数据类型对应java类型
地址: http://otndnld.Oracle.co.jp/document/products/oracle10g/102/doc_cd/Java.102/B19275-03/datacc.htm ...
- Oracle的函数返回表类型(转)
在SQL Server中有表变量,可以在function中方便地返回,习惯SQL Server或者需要把脚本从SQL Server转到Oracle中的朋友可以都会碰到这个问题. Oracle的func ...
- Oracle中Blob和Clob类型的区别与操作
Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...
- Oracle数据库中的blob类型解析
Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须 ...
- Oracle中特殊的变量类型
1.%TYPE 允许用户动态地将数据库中某一列的数据类型与PL/SQL中某个变量关联.语法如下: variable_name table.column%TYPE 2.%ROWTYPE 允许用户定义 ...
- Oracle 修改带数据的字段类型
http://www.cnblogs.com/LDaqiang/articles/1157998.html由于需求变动,现要将一个类型NUMBER(8,2)的字段类型改为 char.大体思路如下: ...
- oracle修改表栏位类型
需求:ID栏位在创建的时候是varchar类型,后续要修改为number类型 因为oracle修改表栏位类型的时候需要栏位内没有数据,因此无法直接把ID从varchar修改为number 1.新建一个 ...
随机推荐
- 【翻译自mos中文文章】重建控制文件的方法
重建控制文件的方法 參考原文: How to Recreate a Controlfile (Doc ID 735106.1) 适用于: Oracle Database - Enterprise Ed ...
- 【WPF/WAF】界面布局(View)文件的多层嵌套(Nest)
碎碎念:使用的是略冷门的Window Application Foundation(WAF)框架,搜到的都是WPF的UserControl用户控件的用法,实在蛋疼. 需求:主界面ShellWindow ...
- HBase shell 命令。
HBase shell 命令. 进入hbase shell console$HBASE_HOME/bin/hbase shell如果有kerberos认证,需要事先使用相应的keytab进行一下认证( ...
- zoj3228 Searching the String AC自动机查询目标串中模式串出现次数(分可覆盖,不可覆盖两种情况)
/** 题目:zoj3228 Searching the String 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=34 ...
- 深入浅出Cache
章节 ① 什么是Cache? Cache的目标? ② Caching住哪些内容? ③ 我们想要的Cache产品 ④ Cache使用方式 ⑤ 对于总体系统的提高 ⑥ 关于Sharding ⑦ Cache ...
- ADC相关参数之---INL和DNL
笔者最近在做的一个项目中,用到一片16位的高分辨率的芯片,借此再学习一下由于ADC和DAC的相关知识,以此巩固. 关于ADC的精度和分辨率将在另外一篇博客讨论,分辨率不等于精度. 一块精度0.2%(或 ...
- 全局结果集,带参数的结果集和动态结果集(struts2)
全局结果集: 当许多action都有共同的结果时,如果每个package都存在一个相同结果,会使得struts.xml比较臃肿,所以使用全局的结果集.一个包内的全局结果集可以通过包的继承而被其它包使用 ...
- 【转】【Linux】linux awk命令详解
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- e679. 浮雕化图像
This example demonstrates a 3x3 kernel that embosses an image. Kernel kernel = new Kernel(3, 3, new ...
- (转)RTP协议全解(H264码流和PS流)
写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...