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個,因為在作為字符串文本分析的時候會減少兩個,在函數執行時在內層字符串常量里面會再次被解析一個。