Oracle字段number类型与varchar2类型
NUMBER ( precision, scale)
1.  precision表⽰数字中的有效位;如果没有指定precision的话,Oracle将使⽤38作为精度。
2.  如果scale⼤于零,表⽰数字精确到⼩数点右边的位数;scale默认设置为0;如果scale⼩于零,Oracle将把该数字取舍到⼩数点左边
的指定位数。
3.  Precision的取值范围为【1---38】;Scale的取值范围为【-84---127】。
4.  NUMBER整数部分允许的长度为(precision- scale),⽆论scale是正数还是负数。
5.  如果precision⼩于scale,表⽰存储的是没有整数的⼩数。
6.  Precision表⽰有效位数,有效数位:从左边第⼀个不为0的数算起,⼩数点和负号不计⼊有效位数;scale表⽰精确到多少位,指精
确到⼩数点左边或右边多少位(+-决定)。
7.  Number值类型举例:
实际值数据类型存储值
1234567.89Number1234567.89
1234567.89Number(8)1234567
1234567.89Number(6)出错
1234567.89Number(9,1)1234567.9
1234567.89Number(9,3)出错
1234567.89Number(7,2)出错
1234567.89Number(5,-2)1234600
1234511.89Number(5,-2)1234500
1234567.89Number(5,-4)1230000
1234567.89Number(*,1)1234567.9
0.012Number(2,3)0.012
decimal是整数数据类型0.23Number(2,3)出错
NUMBER类型的⼦类
a)  oracle本来就没有int类型,为了与别的数据库兼容,新增了int类型作为number类型的⼦集。
b)  int类型只能存储整数;number可以存储浮点数,也可以存储整数。
c)  在oracle数据库建表的时候,decimal,numeric不带精度,oracle会⾃动把它处理成INTEGER;带精度,oracle会⾃动把它处理成number。
d)  Oracle只⽤NUMBER(m,n)就可以表⽰任何复杂的数字数据。
e)  decimal,numeric,int等都为SQL、DB2等数据库的数据类型,ORACLE为了兼容才将其引⼊;但实际上在ORACLE内部还是以NUMBER的形式将其存⼊。
char  --  的长度为⼀个字节,表达的数值范围是0~255,CHAR的长度是固定的;
varchar -- 存放定长的字符数据,最长2000個字符;
varchar2 -- 存放可变长字符数据,最⼤长度为4000字符。
char对于不够位数的⽤空格添补,varchar2不⽤。可以试着⽐较⼀下。
varchar2把所有字符都占两字节处理(⼀般情况下),varchar只对汉字和全⾓等字符占两字节,数字,英⽂字符等都是⼀个字节;
VARCHAR2把空串等同于null处理,⽽varchar仍按照空串处理;
VARCHAR2字符要⽤⼏个字节存储,要看数据库使⽤的字符集,
varchar2和varchar的⽬前没有区别,不过ocacle以后的版本就不⽀持varchar类型,如果想新版本的数据库兼容就不要⽤varchar,如果想和其它数据库兼容就不要⽤varchar2
⼤部分情况下建议使⽤varchar2类型,可以保证更好的兼容性。
何时该⽤CHAR,何时该⽤varchar2?
CHAR与VARCHAR2是⼀对⽭盾的统⼀体,两者是互补的关系.
VARCHAR2⽐CHAR节省空间,在效率上⽐CHAR会稍微差⼀些,即要想获得效率,就必须牺牲⼀定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
VARCHAR2虽然⽐CHAR节省空间,但是如果⼀个VARCHAR2列经常被修改,⽽且每次被修改的数据的长度不同,这会引起‘⾏迁移’(Row Migration)现象,⽽这造成多余的I/O,是数据库设计和调整中要尽⼒避免的,在这种情况下⽤CHAR代替VARCHAR2会更好⼀些。