
4.1 Oracle数据类型介绍
Oracle支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型等。
(1)数值数据类型:包括整数类型和小数类型。
(2)日期/时间类型:包括DATE和TIMESTAMP。
(3)字符串类型:包括CHAR、VARCHAR2、NVARCHAR2、NCHAR和LONG 5种。
4.1.1 数值数据类型
数值型数据类型主要用来存储数字,Oracle提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。Oracle的数值类型主要通过number(m,n)类型来实现。使用的语法格式如下:

其中m的取值范围为1~38,n的取值范围为-84~127。
number(m,n)是可变长的数值列,允许0、正值及负值,m是所有有效数字的位数,n是小数点以后的位数。如:

则这个字段的最大值是99.999,如果数值超出了位数限制就会被截取多余的位数。
如:

但在一行数据中的这个字段输入575.316,则真正保存到字段中的数值是575.32。
如:

输入575.316,真正保存的数据是575。对于整数,可以省略后面的0,直接表示如下:

在第3章“开始创建表”章节中,有如下创建表的语句:

id字段的数据类型为NUMBER(11),注意到后面的数字11,这表示的是该数据类型指定的最大长度,如果插入数值的位数大于11,则会弹出以下错误信息:

【例4.1】创建表tmp1,其中字段x、y数据类型依次为NUMBER(4)、NUMBER(6),SQL语句如下:

执行成功之后,便用DESC查看表结构,结果如下:

不同的数字类型的长度不同,取值范围不同,并且需要不同的存储空间,因此,应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。
【例4.2】创建表tmp2,其中字段x、y、z数据类型依次为NUMBER(5,1)、NUMBER(5,3)和NUMBER(5,2),向表中插入数据5.12、5.15和5.123,SQL语句如下:

向表中插入数据:

插入数据后,查下输入的数据信息。SQL语句如下:

从结果可以看出5.12和5.123分别被存储为5.1和5.12。
4.1.2 日期与时间类型
Oracle中表示日期的数据类型,主要包括DATE和TIMESTAMP。具体含义和区别如表4-1所示。
表4-1 日期与时间数据类型

【例4.3】创建数据表tmp3,定义数据类型为date的字段d,向表中插入值“12-5月-2010”,SQL语句说明如下。
首先创建表tmp3:

在插入数据之前,需要知道数据库默认的时间格式,查询SQL语句如下:

向表中插入数据:

查看结果如下:

如果用户想按照指定的格式输入时间,需要修改时间的默认格式。例如输入格式为“年-月-日”,修改的SQL语句如下。

【例4.4】创建数据表tmp4,定义数据类型为DATE的字段d,向表中插入“YYYY-MM-DD”和“YYYYMMDD”字符串格式日期,SQL语句如下:
首先创建表tmp4:

修改日期的默认格式,SQL语句如下。

向表中插入“YYYY-MM-DD”格式日期:

向表中插入“YYYYMMDD”格式日期:

查看插入结果:

可以看到,各个不同类型的日期值都正确地插入到了数据表中。
【例4.5】向tmp4表中插入系统当前日期,SQL语句如下:
首先删除表中的数据:

向表中插入系统当前日期:

查看插入结果:

【例4.6】向tmp4表中插入系统日期和时间并指定格式,SQL语句如下:
首先删除表中的数据:

向表中插入系统当前日期:

查看插入结果:

从结果可以看出,只显示日期,时间被省略掉了。
【例4.7】创建数据表tmp5,定义数据类型为TIMESTAMP的字段ts,向表中插入值'2013-9-16 17:03:00.9999',SQL语句如下:
创建数据表tmp5:

向表中插入数据:

查看插入结果:

4.1.3 字符串类型
字符串类型用来存储字符串数据。Oracle中字符串类型指CHAR、VARCHAR2、NCHAR、NVARCHAR2和LONG。表4-2列出了Oracle中的字符串数据类型。
表4-2 Oracle中字符串数据类型

VARCHAR2、NVARCHAR2和LONG类型是变长类型,对于其存储需求取决于列值的实际长度,而不是取决于类型的最大可能尺寸。例如,一个VARCHAR2(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度。
【例4.8】创建tmp6表,定义字段ch和vch数据类型依次为CHAR(4)、VARCHAR2(4),向表中插入数据“ab”,SQL语句如下:
创建表tmp6:

输入数据:

查询ch字段的存储长度,执行SQL语句如下:

查询vch字段的存储长度,执行SQL语句如下:

可见定长字符串在存储时长度是固定的,而变长字符串的存储长度根据实际插入的数据长度而定。