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对比和转换策略的更多相关文章

  1. 对于Oracle中Number类型的字段映射成Java中的具体类型的问题

    我在Oracle中给一个用户Id字段设置为Number类型,使用JDBC在完成ORM的时候,以为其可以自动转换为Integer,因为我的POJO类id使用的就是Integer.但事实是,我在测试的时候 ...

  2. EF:oracle的number类型映射为C#的boolean类型

    一开始用下面的方法映射, Property(p => p.IsFixed).HasColumnName("IS_FIXED").HasColumnType("num ...

  3. oracle中数据类型对应java类型

    地址: http://otndnld.Oracle.co.jp/document/products/oracle10g/102/doc_cd/Java.102/B19275-03/datacc.htm ...

  4. Oracle的函数返回表类型(转)

    在SQL Server中有表变量,可以在function中方便地返回,习惯SQL Server或者需要把脚本从SQL Server转到Oracle中的朋友可以都会碰到这个问题. Oracle的func ...

  5. Oracle中Blob和Clob类型的区别与操作

    Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...

  6. Oracle数据库中的blob类型解析

    Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须 ...

  7. Oracle中特殊的变量类型

    1.%TYPE 允许用户动态地将数据库中某一列的数据类型与PL/SQL中某个变量关联.语法如下: variable_name table.column%TYPE   2.%ROWTYPE 允许用户定义 ...

  8. Oracle 修改带数据的字段类型

    http://www.cnblogs.com/LDaqiang/articles/1157998.html由于需求变动,现要将一个类型NUMBER(8,2)的字段类型改为 char.大体思路如下:   ...

  9. oracle修改表栏位类型

    需求:ID栏位在创建的时候是varchar类型,后续要修改为number类型 因为oracle修改表栏位类型的时候需要栏位内没有数据,因此无法直接把ID从varchar修改为number 1.新建一个 ...

随机推荐

  1. loadrunner11 测试restful

    loadrunner不知道为啥会有这么大的体积. 一开始用的是c脚本,可是恶心的是又不是完全的c,读文件的fseek居然没有. 后来又折腾java脚本,发现loadrunner11 java要用jdk ...

  2. 我的电脑(ACER 4750G)升级

    升级原因 近期电脑卡的要死,卡到什么程序呢?就是打开"我的电脑"须要2秒中的缓冲时间,这怎样受的了--于是就有种特别想换电脑的冲动:买一个顶配版的台式机.让你给我慢. 一心想着顶配 ...

  3. C# 回调与 javascritp 回调 比较

    C#: using System; using System.Collections.Generic; using System.Text; namespace Delegate { //定义委托,它 ...

  4. 【Unity笔记】一些Mecanim动画系统、状态机的参数细节

    动画混合树Blend Tree调整动画片段的播放速度: 0 动画不播放 -1 动画倒着播放:如果只有“往前走”的动画,可以变成“往后走”动画 勾选动画是否镜像: 左右颠倒(挥左手变成挥右手) 过度条件 ...

  5. BusyBox init工作流程

    linux启动完成后,运行由Busybox产生的init进程. /sbin/init是系统启动的第一个用户进程,pid=1.init的工作是根据/etc/inittab脚本来进行系统的初始化工作,关机 ...

  6. asp.net mvc 4 AntiForgery 提供的防伪标记适用于用户“”,但当前用户为“XX” 问题处理记录

    情景:    某页面未登录下可以访问,但具体操作时发现未登录就弹出登录窗,待完成登录后继续操作. 当登录成功,前端继续操作(post后端接口)时发现以下错误:   提供的防伪标记适用于用户“”,但当前 ...

  7. 基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序

    基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序 不知道为什么,保存的时候显示有一个连接为违禁内容,可能是…………. ...

  8. Spring 4 官方文档学习(十)数据访问之ORM

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html 占位用,暂略.

  9. Android多线程任务的优化1:AsyncTask的缺陷 (转至 http://www.linuxidc.com/Linux/2011-09/43150.htm)

    导语:在开发Android应用的过程中,我们需要时刻注意保障应用的稳定性和界面响应性,因为不稳定或者响应速度慢的应用将会给用户带来非常差的交互体验.在越来越讲究用户体验的大环境下,用户也许会因为应用的 ...

  10. 转载:QT QTableView用法小结

    出自: http://blog.chinaunix.net/uid-20382483-id-3518513.html QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: ...