一. 内建的数据类型
1. 数字相关
1)INTEGER
整型,范围为:-2147483647-2147483648
2)SMALLINT
短整型,-32767-32767
3)INT8
1. 数字相关
1)INTEGER
整型,范围为:-2147483647-2147483648
2)SMALLINT
短整型,-32767-32767
3)INT8
长整型 –(263 –1) - 263 –1
4)DECIMAL(p,s)
可调整精度浮点型10-130 - 10124
SMALLINT和INTEGER的优势:
占用很小的空间,分别占用2个字节和4个字节
可以对他们执行算术表达式和排序操作
SMALLINT和INTEGER的劣势:
可以存储数值的范围有限
只有IDS才支持INT8,虽然占据的空间是INT的两倍,但是存储的数值的范围增大到:
–(263 –1) - 263 –1
DECIMAL(p,s)的优势:
p指数据的精度,其范围从1到32,s则用以确定小数位数,是0的时候等同于DECIMAL(p)表示整数。他完整涵盖了SMALLFLOAT和FLOAT的表达范围。DECIMAL(p)占用的存储空间为p/2+1个字节,而DECIMAL(p,s)占用的存储空间,如果s是偶数,占用(p +3)/2个字节,s为奇数(p + 4)/2个字节。
DECIMAL(p,s)的劣势:
缺点是算术运算的效率比较低,且许多变成语言不支持此种格式。
4)SERIAL、SERIAL8、BIGSERIAL
这三种类型都会自动产生数据,并且用户可选择是否提供初始值.
不同之处在于:
SERIAL类型的数据占用4个字节的存储空间;
SERIAL8类型的数据一般情况下占用10个字节的存储空间(在Extended Parallel Server中占用8个字节的存储空间);
BIGSERIAL类型的数据占用8个字节的存储空间。
eg1. 创建一个表route_rule,它的主键rule_id是属于SERIAL自增类型的,参考建表语句如下:
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 nullinsert语句字段顺序,
rule varchar(128) not null,
action varchar(32) not null,
route_arg varchar(32),
primary key (rule_id) constraint PK_ROUTE_RULE
);
(
rule_id serial not nullinsert语句字段顺序,
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为双精度类型:
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)
)
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
日期型,随数据库不同而不同.
这两种类型的数据使用于不要求精度而要求量值的场合,如科学计算,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的类型.语句如下:
例如将上面的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类型,建表语句参考如下:
用于记录时间点,表示的精度可以任意指定,可以包含年份、月份、日。
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类型,并且只包含“时:分:秒”,建表语句参考如下:
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);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论