1、Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Ssm,Oracle,数据类型,单世民,Oracle,数据类型概述,LONG,NVARCHAR2,VARCHAR2,NCHAR,CHAR,RAW,BLOB,LONG RAW,NUMBER,BINARY_FLOAT,BINARY_DOUBLE,BFILE,CLOB,NCLOB,DATE,TIMESTAMP,TIMESTAMP,WITH TIME ZONE,TIMEST
2、AMP,WITH LOCAL TIME ZONE,INTERVAL,YEAR TO MONTH,INTERVAL,DAY TO SECOND,ROWID,UROWID,字符类型,数值类型,二进制类型,日期和时间,类型,LONG,类型,LOB,类型,ROWID/,UROWID,类型,字符类型,概述,Oracle,中的字符数据类型包括,CHAR,、,VARCHAR2,以及带“,N”,的相应变体(,NCHAR,和,NVARCHAR2,),这些字符数据类型能存储,2000,字节或,4000,字节的文本。这些文本会由数据库根据需要在不同的字符集(,character set,)之间进行转换。,CHAR,
3、、,VARCHAR2,、,NCHAR,、,NVARCHAR2,都是以同样的格式进行存储。,字符类型,NLS,(国家语言支持),NLS,全称是,National Language Support,。,NLS,是数据库的一个非常强大的特性,控制着数据的许多方面,最重要的两个方面是:,文本数据持久存储在磁盘上时如何编码,透明地将数据从一个字符集转换到另一个字符集,字符类型,如何查看当前的数据库字符集设定,SELECT,*,FROM,nls_database_parameters,WHERE,parameter=NLS_CHARACTERSET,字符类型,CHARCHAR,是定长字符串类型,总会用空格
4、填充来达到其最大长度。,CHAR,字段最多可以存储,2000,字节的信息。正常情况下,,size,的单位默认为,BYTE,。,CHAR(,size,BYTE,|,CHAR,),字符类型,VARCHAR2VARCHAR2,是变长字符串类型,不会用空格填充至最大长度。此类型最多可存储,4000,字节的信息。,VARCHAR2(,size,BYTE,|,CHAR,),为什么称为,VARCHAR2,而不是,VARCHAR?,也有一个数据类型是,VARCHAR,然而,,Oracle,公司声称他们将来可能会改变,VARCHAR,的字段行为,我们无法知道“改变后的”,VARCHAR,将会如何。所以,当前应尽
5、量避免使用,VARCHAR,字符类型,NCHAR/NVARCHAR2,两种数据类型用于包含,UNICODE,格式数据的字符串,以支持某些应用中对多字节数据的需求。两者的存储字符数上界分别是,2000/4000,字节。,NVARCHAR2,和,NCHAR,与相应的,VARCHAR2,和,CHAR,的区别在于:,文本采用数据库的国家字符集来存储和管理,而不是默认字符集,长度总是字符数,而,CHAR/VARCHAR2,可能会指定是字节还是字符,字符类型,判断:,vchar_col,列可以存储多少字符(每字符,4,字节),?,1000,字符,VARCHAR2,中存储的字节数上界是,4000,。如果选择
6、的字符集中每个字符都要使用,4,个字节来表示,那么,vchar_col,字段只能放下,1000,个字符,CREATE TABLE T(vchar_col VARCHAR2(4000 CHAR);,字符类型,判断:,是否可以如下定义,vchar_col,列,?,不可以,NVARCHAR2,中存储的字节数上界也是,4000,。但是定义时长度参数总是表示字符数,没有字节(,BYTE,)还是字符(,CHAR,)的选择问题,CREATE TABLE T(vchar_col NVARCHAR2(4000 CHAR);,数值类型,NUMBEROracle9i Release 2,及以前的版本只支持一种适合存
7、储数值数据的固有数据类型。在所有的,Oracle,版本中,NUMBER,都得到支持,NUMBER,类型精度可达,38,位。可以存储小到,10e,-130,、大到(但不包括),10e,126,的任何数值,数值类型,NUMBER,精度(,precision,)也称为总位数,取值范围,138,,默认值为,38,,也可以用字符*表示,38,小数位数(,scale,)也称为小数点右边的位数,合法值,-48127,,默认值取决于是否指定了精度。如果没有指定精度,小数位数则默认有最大的取值区间。如果指定了精度,小数位数默认为,0,NUMBER(,precision,scale,),数值类型,判断:,num_
8、col,字段是否可以存储小数?,可以如果没有指定精度,小数位数则默认有最大的取值区间,换句话说,定义,NUMBER,的列会存储浮点数(有小数),CREATE TABLE T(num_col NUMBER);,数值类型,判断:,num_col,字段是否可以存储小数?,不可以如果指定小数位数为,0,,那么相应字段只能存储整数数据(没有小数),CREATE TABLE T(num_col NUMBER(5);,数值类型,判断:,num_col,字段是否可以存储,123456,?,不可以,123456,含有,6,位数字,超过了定义时所规定的精度(,5,位)。因此,可以使用精度来保证某些数据完整性约束。
9、,CREATE TABLE T(num_col NUMBER(5,0);,数值类型,判断:,向,num_col,插入,123.456,,,Oracle,是否会报错?,不会小数位数可以用于控制数值的“舍入”。尽管,123.456,超过了,5,位,但是,Oracle,会利用小数位数将,123.456”,舍入”为只有两位小数,这就得到了,123.46,,再根据精度来验证,123.46,,满足精度要求,CREATE TABLE T(num_col NUMBER(5,2);,数值类型,判断:,向,num_col,插入,1234,,,Oracle,是否会报错?,会数值,1234.00,的总位数超过了,5,
10、位。指定小数位数为,2,时,小数点左边最多只能有,3,位,右边有两位。因此,,1234,超过了定义的精度。,NUMBER(5,2),列的存储范围是,-999.99999.99,CREATE TABLE T(num_col NUMBER(5,2);,数值类型,判断:,是否可以如下定义,num_col,字段?,可以将小数位数定义为负值,作用在于允许对小数点左边的值舍入,CREATE TABLE T(num_col NUMBER(5,-2);,数值类型,判断:,向,num_col,插入,123.456,,数据库会最终存储的数值是多少?,100,就像,NUMBER(5,2),将值舍入为最接近的,0.0
11、1,量级一样,,NUMBER(5,-2),会把数值舍入为与之最接近的,100,量级,CREATE TABLE T(num_col NUMBER(5,-2);,数值类型,判断:,向,num_col,插入,1234567,,,Oracle,是否会报错?,不会精度指示了舍入后数值允许有多少位,并使用小数位数来确定如何舍入,CREATE TABLE T(num_col NUMBER(5,-2),数值类型,判断:,NUMBER,数据类型是定长类型?,错,NUMBER,类型是一种变长格式,长度为,022,字节。随着有效数字数字的增加,,NUMBER,类型需要越来越多的存储空间。每增加两位有效数字,就需要另
12、外一个字节的存储空间。,Oracle,存储一个数时,会使用尽可能少的内容来表示。为此,它会存储有效数字、用户指定小数点位置的一个指数,以及有关数值符号的信息,数值类型,BINARY_FLOAT/BINARY_DOUBLE,类型在,Oracle 10g,之前的版本中没有这两种类型。他们就是,IEEE,标准浮点数,用于近似数值,没有,NUMBER,类型精确。,BINARY_FLOAT,BINARY_DOUBLE,浮点数常用于科学计算中,可在硬件(,CPU,芯片)上执行运算,用于科学计算中的实数处理,处理速度会快的多。不过,浮点数不适合于存储金融信息,数值类型,特殊值,特殊值,描述,BINARY_F
13、LOAT_NAN,非,BINARY_FLOAT,类型的数字(,NaN,),BINARY_FLOAT_INFINITY,BINARY_FLOAT,类型的无穷大(,INF,),BINARY_DOUBLE_NAN,非,BINARY_DOUBLE,类型的数字(,NaN,),BINARY_DOUBLE_INFINITY,BINARY_DOUBLE,类型的无穷大(,INF,),数值类型,Oracle,在语法上支持的其他数值数据类型,NUMBER,NUMERIC,(,p,s,),DECIMAL,(,p,s,),DEC,(,p,s,),INTEGER,INT,SMALLINT,FLOAT,(,b,),DOUB
14、LE PRECISION,REAL,二进制类型,数据库中以二进制类型存储的二进制数据不会进行字符集转换,而文本类型需要进行字符集转换,Oracle,支持,3,种数据类型来存储二进制数据,RAW,类型能够存储最多,2000,字节的二进制数据,BLOB,类型也即大对象类型,LONG RAW,类型此类型是为了支持向后兼容性提供的,二进制类型,RAWRAW,类型是一个变长度的二进制串,物理上限是,2000,字节,不能存储可直接显示的字符数据。当使用,SQL*PLUS,等许多工具处理,RAW,数据时,这些,RAW,数据会被隐式地转换为一个,VARCHAR2,类型。,RAW(,size,),二进制类型,判
15、断:,对于仅包含一个,16,字节长,RAW,类型的表,T,,通过,SQL*Plus,,,Oracle,会如何处理如下所示的命令?能成功执行插入字符,abcdef,么?,会成功执行插入操作,但是插入的数据并不是字符串,abcdef,,而是一个,3,字节的,RAW,数据。,SQL*PLUS,将,RAW,类型获取为一个串时,会隐式地调用,RAWTOHEX,函数,而插入串时会隐式地调用,HEXTORAW,函数。,INSERT INTO T VALUES(abcdef);,二进制类型,判断:,对于仅包含一个,16,字节长,RAW,类型的表,T,,通过,SQL*Plus,,,Oracle,会如何处理如下所
16、示的命令?,报错,错误信息为”,invalid hex number”,。,INSERT INTO T VALUES(abcdefgh);,日期类型,Oracle,固有数据类型,DATE,、,TIMESTAMP,和,INTERVAL,是紧密相关的。,DATE,和,TIMESTAMP,类型可以存储固定日期,/,时间。,INTERVAL,类型可以存储一个时间量。,TIMESTAMP,相对于,DATE,的两个优势:,支持小数秒,支持时区,日期类型,判断:,DATE,类型就是用来存储日期(年月日)的?,错,DATE,类型不仅可以用来存储日期,还存储了有关时间的信息,精度可以到达整数秒。,日期类型,DA
17、TEDATE,类型是一个,7,字节的定宽日期,/,时间数据类型。它总是包含,7,个属性,包括:世纪、世纪中的哪一年、月份、月份中的哪一天、小时、分钟和秒。,Oracle,使用一种内部格式来表示这些信息。,日期类型,判断:,在书写过程中使用的日期格式会以某种方式影响磁盘上存储的数据,并且会影响数据如何存储?,错格式对数据如何存储根本没有任何影响。格式只是用于将存储,DATE,所用的二进制格式转换为一个串,或者将一个串转换为用于存储,DATE,的二进制格式,对于,TIMESTAMP,和,INTERVAL,也是如此,日期类型,日期类型到底是怎么存储的?,Oracle,以数值方式存储日期。,Oracl
18、e,支持儒略历(,Julian date,)。当系统使用儒略历时,它指定一个开始日期为第一天;接下来的一天为第二天等等,每个次日都将计数值增加,1,。,Oracle,所支持的儒略历的开始日期是公元前,4712,年的,1,月,1,日。用户使用熟悉的文本表示方式输入日期,,Oracle,在后台将它们转换成对应的儒略历。此外,儒略历还可以存储时间值,时间以小数值存储在表示日期的整数值之后。,日期类型,使用日期相关的系统变量存储时间信息时,应注意在查询时适当结合使用,TRUNC,函数。,ROWID/UROWID,类型,ROWIDROWID,是数据库中一行的地址。,ROWID,中编入了足够多的信息,足以
19、在磁盘上找到行,以及标识,ROWID,所指向的对象。,ROWID,并不真正存储在行中,而是行的一个推导属性,基于行的物理地址生成。,Oracle,中除了索引组织表(,IOT,)外的所有行都有,ROWID,。,ROWID,主要用于作为物理地址来减少行更新操作的操作代价,加快访问任何表中某一行的速度。,ROWID/UROWID,类型,UROWIDUROWID,是,ROWID,的“近亲”。它用于比如索引组织表(,IOT,)和通过异构数据库网关访问的没有固定,ROWID,的表。,UROWID,基于行的主键生成,是行主键值的一个表示。但是,,UROWID,并不作为一个单独的列存在,而只是作为现有列的一个
20、函数。,LONG,类型,Oracle,中的,LONG,类型有两种:,LONG,文本类型:可以存储,2GB,的文本,LONG RAW,类型:可以存储,2GB,的原始二进制数据,“,不要创建带,LONG,列的表,而应该使用,LOB,列(,CLOB,NCLOB,BLOB,)。支持,LONG,列只是为了保证向后兼容性。”(,Oracle SQL Reference,),大对象类型,Oracle,支持,LOB,或大对象(,Large OBject,)类型共有,4,种,分为两类:,存储在数据库中的,LOB,,也称为内部,LOB,CLOB,NCLOB,BLOB,存储在数据库之外的,LOB,BFILE,小结,数据类型概述,字符类型,数值类型,二进制类型,日期类型,ROWID/UROWID,LONG,类型,大对象类型,