Oracle第二章——Oracle数据类型
当创建一个表时,需要为表的各个列指定数据类型,Oracle的数据类型主要有5种,字符类型、数值类型、日期时间类型、LOB类型和伪列。
一、字符类型
1、CHAR类型
定长字符串,长度为1~2000字节,如果定义时未指定大小,默认为1,使用时,若存储的值大小小于指定的长度,则用空格填充剩余长度,
若大于指定长度,则报错。示例:CHAR(20),若此时存储一个长度为10的字符串,则还是占用20个字节的空间。(此外,还可以用
CHAR(20CHAR)的方式进行定义,这种方式的意思是存储多少个字符,而不是字节)。
2、VARCHAR2类型
可变字符串,长度为1~4000字节,定义时需指定大小,使用时,若存储的值大小小于指定的长度,则长度缩小为值的大小,若大于指定长度,
则报错。(Oracle也有VARCHAR类型,但该类型有可能会被在未来的版本中被重新定义,所以不推荐使用)示例:VARCHAR2(20),
若此时存储一个长度为10的字符串,则占用10个字节的空间。(也可以使用VARCHAR2(20CHAR)的方式定义,意思同CHAR类型)。
3、NCHAR类型
存储Unicode字符的定长字符串,既存储双字节字符类型数据,每个字符占用2个字节,其他特性与CHAR类型相似。示例:NCHAR(20),
若此时存储一个长度为10的字符串,则占用40个字节的空间。
4、NVARCHAR2类型
存储Unicode字符的可变字符串,其他特性与VARCHAR2类型相似。示例:NVARCHAR2(20),若此时存储一个长度为10的字符串,
则占用20个字节的空间。
二、数值类型
1、NUMBER类型
NUMBER类型可以存储正数、负数、0、定点数和浮点数。格式为NUMBER(P,S),其中P为精度,表示数值的有效位数(从左边第一个不为0
的数字算起,不包括小数点和负号为有效位数),在1~38之间。S为范围,表示小数点右边数字的位数,在-84~127之间。使用规则:
将值精确到小数点右边S位并四舍五入,判断有效位数是否<=P。以下结合几个示例进行说明:
(1)、NUMBER(3):当要存储的值是100时,精确到小数点右边0位并四舍五入后值为100,有效位数为3,可以存储。当值是3.563时,
精确到小数点右边0位并四舍五入后值为4,有效位数为1,可以存储。当值是2350.5时,精确到小数点右边0位并四舍五入后值为2351,
有效位数为4,不可以存储。
(2)、NUMBER(3,2):当要存储的值是100时,精确到小数点右边2位并四舍五入后值为100.00,有效位数为5,不可以存储。当值是3.563时,
精确到小数点右边2位并四舍五入后值为3.56,有效位数为3,可以存储。当值是2350.5时,精确到小数点右边2位并四舍五入后
值为2350.50,有效位数为6,不可以存储。
(3)、NUMBER(3,-2):当S为负数时,较为特殊,会将值左边|S|(|S|为S的绝对值)位的值进行四舍五入后取0且不计入有效位数,
如:当要存储的值是100时,实际值为100,有效位数为1,可以存储。当值是3.5时,实际值为0,有效位数为1,可以存储。
当值是2350.5时,实际值为2400,有效位数为2,可以存储。
2、INTEGER类型
是NUMBER的子类型,等同于NUMBER(38,0),用于储存整数。
3、FLOAT类型
是NUMBER的子类型,格式为FLOAT(n),n在1~126之间,这个值是二进制的精度,最大值126转换为十进制大概为38。
三、日期时间类型
1、DATE类型
存储日期和时间的类型,使用7个字节的固定长度,存储世纪、年、月、日、时、分、秒,最小时间为公元前4712年1月1日,最大时间为
公元9999年12月31日。可以使用SYSDATE函数获取当前时间的DATE类型。
2、TIMESTAMP类型
存储日期和时间的类型,使用7到12字节长度,秒数精确到小数秒(不指定精度的情况下为小数点后6位,指定精度可以达到9位),
且包含时区信息。可以使用SYSTIMESTAMP函数获取当前时间的TIMESTAMP类型。
四、LOB类型
1、CLOB类型
存储大量字符数据,可以存储单字节字符数据和多字节字符数据,主要用于存储非结构化XML文档。
2、BLOB类型
存储二进制对象,如图片、视频和音乐。
3、BFILE类型
存储一个定位器,该定位器指向一个服务器文件系统的二进制文件,最大为4G。
4、NCLOB类型
与CLON类似,不过NCLON可同时支持固定宽度字符集和可变宽度字符集,最大为4G。
操作LOB类型数据可以使用PL/SQL提供的DBMS_LOB程序包来完成,使用LOB类型要合理分配好表空间,否则会对性能造成影响。
五、伪列
伪列的定义:类似于表中的列,但并未实际存储在表中,无法对伪列进行增删改。
1、ROWID
表中的每一行都有一个地址,可以唯一的标识数据库中的一行,ROWID可以返回这个地址,可以用来作为查询条件查询唯一行,提高查询效率,
还可以查看行在表中是如何存储的。
2、ROWNUM
ROWNUM伪列可以为查询结果从1开始进行排序,可以用来限制返回行数,Oracle的分页就是使用ROWNUM实现的。需注意,使用ROWNUM
必须包含1,否则无法查出数据,也就是说,ROWNUM=1可以查询出结果集中第一行的数据,但ROWNUM=2是无法查询任何数据的,
还有ROWNUM>2也是无法查询出任何数据的,但使用ROWNUM<2就可以查询出两条数据,这是因为ROWNUM是一个从1开始的伪列,
Oracle认为ROWNUM>n(n为大于1的自然数)的条件不成立,所有无法查出数据。
(关于伪列的更多资料可以查看官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e41084/pseudocolumns.htm#SQLRF0025)