Postgresql中的dataType
1.整数类型
smallint(int2) 2bytes
integer(int,int4) 4bytes
bigint(int8) 8bytes
2.任意精度数值
numeric(precision,scale),用于精确的货币和科学计算。
eg:23.5141,precision=6,scale-4
如果指定,precision最大值为1000,如果numeric中没有指定precious,小数点前最多有131072个数字,小数点后最多有16383个数字。
如果插入的数值大于(precision-scale)的平方值,会报错如果插入的数值的小数位数多余scale,则会四舍五入。
numeric物理存储上类似于varchar(n),每4个十进制数字2个bytes,再加上5到8个bytes的额外开销。
3.浮点类型(非精确的数值类型)
real和double precision不适合做精确的存储和计算。太大或太小的数字都会引发错误。
real :1E-37~1E+37,precision>=6,4bytes
double precision:1E-307~1E+308,precision>=15,8bytes
float(precision):float(1)~float(24)=real,float(25)~float(53)=double precision,
float=double precision
4.序列号类型(正整数,从1开始)
serial、bigserial不是真正的类型,只是为唯一标识列提供方便,类似AUTO_INCREMENT property
insert into tablename values(nextval(’tablename_colname_seq’)) = insert into tablename values(default)
serial=serial4,创建integer列。bigserial=serial8,创建bigint列。
5.monetary类型
money:8bytes 小数精度是由postgresql.conf中的lc_monetary的值配置。values of numeric,int和 bigint可以被转换成money,real和double precision先被转换成numeric,不过这种方式并不推荐。
6.字符类型
varchar(n):有长度限制,超过长度报错,除非超出的字符是空白.varchar不带length,则不限长
char(n):固定长度,空白补齐。char=char(1)。
text:不限长。最长的可能字符串大概是1GB左右。
在postgresql中的char(n)通常在三个当中最慢的,因为需要读取空白字符的额外开销。一般应该使用varchar或text
7.bytea
hex format:将二进制数据编码为每字节两位十六进制数据,整条字符串以\x开头。这种模式能够和很多外部应用程序和协议兼容,转换比“escape format”快。例如:
test=# select E'\\000'::bytea;
bytea
-------
\x00
(1 行)
escape format:是postgresql传统的格式。是用ASCII字符序列来表示二进制串的方法,同时把那些无法表示成ASCII字符的二进制串转换成逃逸序列。
test=# select E'\\000'::bytea;
bytea
-------
\000
(1 行)
输出格式是在postgresql.conf中配置bytea_output,默认是hex,输入两种格式都支持。
8.Date/Time类型
语法格式:type[(p)] 'value'
date input:如1999-01-08是ISO 8601标准格式,是推荐的格式
time input: 如04:05:06.789是ISO 8601标准格式,是推荐的格式
timeZone input:如PST 太平洋标准时间,-8:00:ISO-8601 offset for PST
timestamps:如1999-01-08 04:05:06 -8:00,January 8 04:05:06 1999 PST
interval:时间间隔类型,通过postgresql.conf的intervalstyle调整,或通过set intervalstyle,默认值为postgresql,可设置成sql_standard或iso_8601或postgres_verbose。
9.boolean类型
TRUE/'t'/'true'/'y'/'yes'/'on'/'1'
FALSE/'f'/'false'/'n'/'no'/'off'/'0'
10.枚举类型
先定义,然后再用于表或函数的定义中。
排序的顺序是按照定义的顺序进行比较。
一个枚举类型占4个字节。大小写敏感。空格是有意义的。
从内部枚举值到文本标签的翻译是保存在系统目录pg_enum中,可以直接查询这个catalog。
11.arrays
可以申明一维或多维的数组,也可以申明长度或不申明长度,实际上声明维度或长度都不会影响到运行,和没有申明维度或长度的数组是一样的。这点可以通过psql下的\d tb查看。
注意:a.插入多维数组的时候,每个子数组的维数要一致。
b. 数组元素周围可以用双引号,当元素值中包含逗号或花括弧,则必须加双引号。
如:test=# update tb2 set strarr='{"fds}",fdsf}' where unicol=6;"fds}"此值如果不加引号则会报错。
c. 用ARRAY时,数组字符串元素要用单引号包围,不能用双引号。
如:test=# update tb2 set strarr=array['fsd','ppp'] where unicol=6;
d. 默认情况下访问数组时,数组的小标从1开始。即:array[1]~array[length]。当数组下界不等于1时,数组输出程序才在结果中包含明确的尺寸。
e.为了避免和非片段实例混淆,最好对所有的位数使用片段语言,[1:2][1:1],而不是 [2][1:1].
f.通过给尚不存在的数组元素赋值的方法来扩大数组,所有位于原数组最后一个元素和这个新元素之间的未赋值元素将设为NULL
12.复合类型
类似于c中的结构体,java中的javabean。是由一组字段名和类型组成。
注意:复合类型声明中没有约束。
为了增强sql文的可读性,可以用到Row关键字。如:ROW(’fuzzy dice’, 42, 1.99)作为某个复合类型的值插入table。
如:
test=# create type inventory_item as (name text,sid int);
CREATE TYPE
test=# create table on_hand(item inventory_item);
CREATE TABLE
test=# insert into on_hand values(row('fkdsa',45));
INSERT 0 1
查找复合类型的列:select (item).name from on_hand;(如果item已经是表明的情况下,使用括号)
更新复合类型的列:test=# update on_hand set item.sid = (item).sid+1;(不需要再set后面出现的字段名加括号,但是在等号右边的表达式中引用同一个字段的时候却需要括号。)
13.对象标识类型
无符号4bytes,不建议作为用户表的主键,一般用作系统表的主键。
14.伪类型
伪类型不能作为列的类型。能被用来声明function的参数或结果集的类型。
注意:美元符界定字符串常量比单引号语法更有用,因为在单引号语法表示常量的过程中,如果字符串字面量中包含反斜杠,则每个反斜杠必须写4个,因为在作为字符串文本分析的时候会减少两个,在函数执行时在内层字符串常量里面会再次被解析一个。