postgresql的数据类型比其他数据库类型多,有:
布尔类型,数值类型,字符类型,二进制数据类型,位串类型,日期和时间类型,枚举类型,几何类型,网络地址类型,数组类型,xml类型,json类型,range类型,对象标识符类型,伪类型,其他类型;
类型输入和转换:对于一下简单类型,如数字及字符串,使用通常的方法输入就可以了:
select 1, 1.23, 'abc';
对于复杂类型的数据,可以使用类型名 加上单引号把类型的值格式输入:
select bit '100011';
其实简单类型也可以那样输入:
select int '1' + int '2'; # 3
Postgresql 支持使用标准的SQL的类型转换函数CAST进行类型转换:
select cast('5' as int) ,cast('2000-10-15' as date);
# int 5 , date 2000-10-15
还有一种更加简介的转换类型方式,双冒号的方式:
select '5'::int, '2000-10-15'::date;
详细说明数据类型的使用:
1).布尔类型(true,false); 不分大小写,也可以是包括字符串'y', 'yes', 'n', 'no'这些字符串类型
create table t1(id int, col1 boolean, col2 text);
insert into t1(1, true, 'true');
insert into t1(2, false, 'false');
insert into t1(3, TruE, 'truE');
insert into t1(4, 'y', 'y');
2).数值类型
类型名称 | 存储空间 | 描述 |
smallint | 2字节 | 小范围整数 |
int或integer | 4字节 | 常用类型 |
bigint | 8字节 | 大范围整数 |
numeric或decimal | 变长 | 用户申明的精度 |
real | 4 | 变精度,不精确 |
double precision | 8 | 变精度,不精确 |
serial | 4 | 自增整数 |
bigserial | 8 | 大范围的自增整数 |
重点讲下精确的小数类型:numeric,numeric(m,n), numeric(m)的表示方法;
其中m为精度(也就时说长度,包括小数点后面的数),n为小数点后的个数;
numeric, 不写精度,可以包括任何数字,但不能大于系统所表示的范围;
如:
numeric 可以表示任何类型的数;
numeric(3,2); 表示:小数部分要保留2位有效数字,3 表示长度,也包括小数点的位数,这里,不能大于3位数的数字,否则就会溢出;3.18(true),30.18(false),30(false)
numeric(3) 等于numeric(3,0)
3).浮点数类型(float, double),精确度不高的类型;
需要注意的事项:2个浮点数比较,可能得不到自己想要的结果
除了普通的数值之外,还有几个特殊的值:
Infinity 表示无穷大;
-Infinity 无穷小;
NaN 不是一个数字
4).序列类型(serial 和 bigserial),和Mysql的自增类型一样auto_increment,Postgresql 是通过序列sequence实现的,和Oracle;
下面的一个语句:
create table t (id serial);
等价于下面几句语句:
create sequence t_id_seq;
create table t(id integer not null default nextval('t_id_seq') );
alter sequence t_id_seq owned by t.id;
5).货币类型:(money type )可以存储固定小数的货币数目,与浮点数类型不同。他是完全保证精度的,其输出格式与参数(lc_monetary)设置有关,不同的国家的货币输出方式不同。
select '123.35'::money;
6).数学函数和操作符
7,字符串类型(varchar,char,text)
类型名称 | 描述 |
character varying(n) 简写varchar(n) | 存储空间:4+实际的字符串长度;最大能存储1G字节 |
character(n)简写char(n) | 定长,不够补空白,1G |
text | 变长,无限长度 |
直接写char,默认为char(1), varchar 不带参数,默认接受任何长度的字符串,不带长度说明的时Postgresql的扩展,其他数据库不能这样做;
在其他数据库中char定长字符串可能有性能上的优势,但在Postgresql中和varchar没有差别,使用基本上都使用varchar和text