Oracle建表常⽤数据类型详解
Oracle建表常⽤数据类型详解
前⾔:
为列指定数据类型并不难,难的是指定合适的数据类型。同样是字符串类型,选择定长还是变长,其中⼤有⽂章。所以需要耐⼼⽽细致的学习下⾯的内容。
创建表时,必须为表的各个列指定数据类型。如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存。如为学⽣指定出⽣⽇期为“1980-13-31”。
在Oracle中,常见的数据类型有:
字符串:字符串分为定长类型char和变长类型varchar2。
数字:整数 number(整数位),⼩数 number(总长度,⼩数位),只写number,表⽰⽆限制。
⽇期:date类型,可以保存年⽉⽇时分秒。
问题:Oracle中为什么字符串类型为varchar2,它与varchar有什么关系?
回答:
在Oracle中, varchar已经作为了保留字。如果你使⽤varchar类型,Oracle也不会报错,但是建表以后你会发现,已经⾃动变为了varchar2类型。
问题:⽤number还是⽤integer(整数)?
另外Oracle也有integer等其它类型,但是⽤integer有缺点,就是不知道其长度,甚⾄可能在不同的操作系统上(如32位CPU和64位CPU)所分配的长度是不同的。⽽⽤number,指定多少,就永远是多少,⼀切掌握在⾃⼰⼿中。
问题:如何为字符串和数字类型指定长度?
char类型可以不指定长度,则默认为1,⽽varchar2必须指定长度。
oracle decimal类型char和varchar类型的长度最⼤长度⼤约在4000多⼀点点。
number表⽰不限整数或⼩数,它能够保存⾮常⼤的数字或者保存⼩数位⾮常多的数字。所以为了节约磁盘空间,尽量指定长度。
date:不需要指定长度。
问题:字符串最⼤长度约为4000。如果要保存更多的内容怎么办?
回答:
解决的⽅法有两种。第⼀种是⽤⼤对象类型,即CLOB或者BLOB类型,但是编程⽐较⿇烦;第⼆种是⽤⼀对多的⽗⼦表实现。
⼤对象是指⼤量的数据。如果⽤char或varchar2,列的最⼤长度⼤约在4000多;如果内容更多,其中⼀个⽅法就是将列设置为CLOB类型,但是只限制保存字符数据,如⼩说。如果是⼆进制数据,如图⽚、声⾳、office⽂档,则需要将列设置BLOB类型。CLOB或BLOB最⼤能够装4G的内容。如果是电影,则更通常的做法是在表中保存电影的名称、路径等信息,电影直接保存在磁盘上,⽽不是直接存储在数据库中,也不是⽤BFile类型。
⽰例:创建⼩说表
create table xiao_shuo(
xs_id number(10) primary key, --⼩说编号
xs_name varchar2(5), --⼩说名称
xs_contenct clob, --⼩说内容
xs_fen_mian blob --⼩说封⾯(图⽚)
);
第⼆种是利⽤⽗⼦表实现,例如:⼩说表(⼩说ID,⼩说标题),内容表(⼩说ID,⾏数,⾏内容),其中⾏内容为varchar(4000)。这表⽰每⼀⾏最多保存4000个字符。
重点问题:定长类型和变长类型和什么区别?
回答:
两者主要的区别体现在存储上和查询效率上。
⾸先讲char——定长类型。
如将姓名列指定为char(8)。当保存“张三”时,数据库还会⾃动保存4个空格;保存“张三丰”时,数据库还会⾃动保存2个空格,这样每个⼈的姓名长度都为8,长度是固定的,所以叫做“定长”。明显,在保存信息时,定长会因为保存了很空格⽽多占⽤了磁盘空间。
数据库保存这些“多余”的空格有什么作⽤?
那就是查询时,在取到字段的长度以后,不再需要判断每⼀个姓名的实际长度,就可以取到数据。这样查询效率⼤⼤提⾼了。
下⾯再讲varchar2——变长类型。
如将姓名列指定为varchar2(8)。当保存“张三”和保存“张三丰”时,数据库都只保存数据的本⾝,不会⾃动添加空格。两个⼈姓名的长度分别为4和6,长度是变化的,所以叫做“变长”。这样没有多占⽤任何磁盘空间。
但是在查询时,每个⼈的姓名的长度都不同,必须先判断后取数据,所以查询效率⽐char类型要低。
⼩结:char和varchar的关系就是空间和时间的关系,char是以空间换时间,牺牲了磁盘空间,但羸得了查询时间。
对于Oracle,还有更深层次的区别。
⽐如对于员⼯的“备注”信息,如果⽤varchar(4000)。有的员⼯备注原来很少,后来有可能加⼊⼤量的备注。由于varchar类型是没有在记录之间保存多余的空闲空间的,所以就会引⽤记录的“⾏迁移”,造
成磁盘碎⽚,从⽽降低查询效率。⽽char类型则⽤空格已经占⽤了,不会引⽤磁盘空间的再分配。不会在项⽬使⽤过程中引⽤碎⽚问题。⽐如QQ签名、简介等信息⽤户经常修改,⽤char就⽐varchar要好。
下⾯是Oracle中的系统⽂件中关于数据类型的定义:
subtype FLOAT is NUMBER; – NUMBER(126)
subtype REAL is FLOAT; – FLOAT(63)
subtype “DOUBLE PRECISION” is FLOAT;
subtype INTEGER is NUMBER(38,0);
subtype INT is INTEGER;
subtype SMALLINT is NUMBER(38,0);
subtype DECIMAL is NUMBER(38,0);
subtype NUMERIC is DECIMAL;
subtype DEC is DECIMAL;
subtype BINARY_INTEGER is INTEGER range ‘-2147483647’…2147483647;
subtype NATURAL is BINARY_INTEGER range 0…2147483647;
subtype NATURALN is NATURAL not null;
subtype POSITIVE is BINARY_INTEGER range 1…2147483647;
subtype POSITIVEN is POSITIVE not null;
subtype SIGNTYPE is BINARY_INTEGER range ‘-1’…1; – for SIGN functions
type VARCHAR2 is NEW CHAR_BASE;
subtype VARCHAR is VARCHAR2;
subtype STRING is VARCHAR2;
subtype LONG is VARCHAR2(32760);
subtype RAW is VARCHAR2;
subtype “LONG RAW” is RAW(32760);
subtype ROWID is VARCHAR2(256);
– Ansi fixed-length char
– Define synonyms for CHAR and CHARN.
subtype CHAR is VARCHAR2;
subtype CHARACTER is CHAR;
type MLSLABEL is new CHAR_BASE;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论