一. 内建的数据类型
1. 数字相关
1)INTEGER
整型,范围为:-2147483647-2147483648
2)SMALLINT
短整型,-32767-32767
3)BIGINT
4)SERIAL、SERIAL8、BIGSERIAL
这三种类型都会自动产生数据,并且用户可选择是否提供初始值.
不同之处在于:
SERIAL类型的数据占用4个字节的存储空间;
SERIAL8类型的数据一般情况下占用10个字节的存储空间(在Extended Parallel Server中占用8个字节的存储空间);
BIGSERIAL类型的数据占用8个字节的存储空间。
eg1. 创建一个表route_rule,它的主键rule_id是属于SERIAL自增类型的,参考建表语句如下:
create table route_rule
(
rule_id serial not null,
rule varchar(128) not null,
action varchar(32) not null,
route_arg varchar(32),
primary key (rule_id) constraint PK_ROUTE_RULE
);
eg2. 如何查询serial型字段的当前值?
5)DECIMAL(p,s)
其中p是整个数据的有效位,s是小数点后位数,1<p<32,s可以为0。不指定时默认为16位。
eg1:在如下实例中,创建了human_task_exp表,其中probability为双精度类型:
create table human_task_exp(
serviceid VARCHAR(30) not null,
seconds INTEGER default 0 not null,
probability DECIMAL(16,14) default 0)
)
6)FLOAT、SMALLFLOAT
这两种类型的数据使用于不要求精度而要求量值的场合,如科学计算,FLOAT双精度数,通常占8个字节,有16位十进制有效位,而smallint为单精度数,占4字节,8位十进制有效位。但数值超出精度范围,则都看作0处理
7)MONEY(p, s)
同decimal完全相同,但显示money类型时候会自动显示现金符号,默认是$。
2. 时间相关
1)DATE
日期型,随数据库不同而不同.
eg1. test_date表中包含一个birthday的日期字段,可以通过如下语句插入:
创建表的语句参考如下:
CREATE TABLE test_date(birthday date);
插入记录(一条生日为1982年11月21日的数据)的语句参考如下:
insert into test_date values('11/21/1982');
也可通过如下语句执行如上语句相同的结果:
insert into test_date values(date('11/21/1982'));
eg2. 将DATE类型的数据转换为指定的字符类型
例如将上面的11/21/1982变成1982-11-21的类型.语句如下:
select TO_CHAR(birthday, '%Y-%m-%d') from test_date;
eg3. 获得当前日期
select today from test_date;
eg4. 日期相加减,得到天数,例如将test_date中的当前日期-birthday字段,可得到出生天数,语句如下:
select to_date(to_char(today,'%Y-%m-%d'),'%Y-%m-%d') - to_date(to_char(birthday,'%Y-%m-%d'),'%Y-%m-%d') from test_date;
对于1982-11-21,可得到如下的返回结果(oh,my god,我已经出生那么多天咯):
10211 00:00:00.00000
2)DATETIME
用于记录时间点,表示的精度可以任意指定,可以包含年份、月份、日。
eg1. 将表test_datetime的字段birthtime定义为DATETIME类型,建表语句参考如下:
create table test_datetime(birthtime datetime year to fraction(2));
eg2. 若要在该表中插入一条1982-11-21 12:20:00的数据:
insert into test_datetime values('1982-11-21 12:20:00');
eg3. 插入eg2中同样的记录,还可以使用如下语句:
insert into test_datetime values(datetime(1982-11-21 12:20:00.79) year to fraction(2));
eg4. 将DATE类型的数据转换为指定的字符类型:
select TO_CHAR(birthtime, '%Y-%m-%d %H:%M:%S') from test_datetime;
上面的出生时间的如上语句的结果如下:
1982-11-21 12:20:00
3)INTERVAL
interval类型的数值用于表示两个时间点之间的间隔.
eg1. 将表test_interval的字段interval_filed字段定义为INTERVAL类型,并且只包含“时:分:秒”,建表语句参考如下:
create table test_interval(interval_filed interval hour to second);
eg2. 在上面创建的表中插入一条记录,时间是12:20:05,语句参考如下:
insert into test_interval values ('12:20:05');
eg3. 达到如上语句相同的结果也可以使用到interval函数,语句参考如下:
insert into test_interval values(interval(12:20:05) hour to second);
eg4. 将INTERVAL类型转换为指定的字符类型(HH:MM:SS格式,直接查询就是这个格式,嘻嘻),语句参考如下:
select * from test_interval;
运行结果就是:12:20:05。
3. 字符相关
1)VARCHAR(n, r)
存储变长字符型,最长255字节。
2)CHAR(n)
定义宽度为n的字符字段,最长255。
3)NCHAR(n)
同char,但允许GLS应用程序的不同排序顺序。
4)NVARCHAR(m, r)
同varchar,但允许GLS应用程序的不同排序顺序。
5)LVARCHAR(m)
存储变长字符串,最大32739个字节.
6)CHARACTER VARYING(n, r)
存储用户定义的数据类型,其内部结构对于数据库服务器不透明,即不可存取。
4. 大对象相关
1)BYTE
二进制数据,最大2的31次方字节。byte用于存储任意数据,一般用来存储图片和声音文件等。
2)TEXT
文本型,最大2的31次方字节。
3)BLOB
以随机存取块的形式存储二进制数据。
4)CLOB
以随机存取块的形式存储文本数据。
5. MISC
1)BOOLEAN
存储布尔值true和false。
二. 复杂对象类型(complex data type)
1、复杂数据类型
由一个或多个数据类型组合而成。复杂数据类型有row数据类型、集合数据类型。
2、Row数据类型
由一个或多个任意的数据类型组成;
eg1. 如下创建一个patient的Row数据类型,具有integer类型的num和char类型的name字段,参考语句如下:
CREATE ROW TYPE patient
(
num int,
name char(30)
);
3、集合数据类型
由一个或多个同样的数据类型集合组成,包括SET、LIST和MULTISET。
1)SET(e)数据类型
存储元素的非排序集合,所有元素都具有同一类型e;不允许重复值.
eg1、在如下表中将description字段定义为SET类型,参考语句如下:
CREATE TABLE employee
(
name CHAR(30),
salary INTEGER,
description SET(VARCHAR(100) NOT NULL)
);
eg2. 如何插入SET类型的数据?
eg3. 如何查询SET类型的数据?
2)LIST(e)数据类型
存储元素的排序集合,所有元素都具有同一类型e;允许重复值.
eg1. 创建一个test_list的表,该表的col1是LIST(varcahr)数据类型,建表语句参考如下:
create table test_list
(
col1 list(varchar(30) not null),
col2 DECIMAL(18,6),
col3 char(18)
);
eg2. 如何插入LIST类型的值?
eg3. 如何查询LIST类型的值?
3)MULTISET(e)数据类型
存储元素的非排序集合,所有元素都具有同一类型e;允许重复值。
三. 自定义对象类型(User Defined Datatypes)
1、Distinct
2、Opaque
posted on 2010-11-04 17:31
阿蜜果 阅读(11001)
评论(1) 编辑 收藏 所属分类:
database