官方數據類型document https://www.postgresql.org/docs/10/static/datatype.htmlhtml
PostgreSQL擁有豐富的數據類型供用戶使用。用戶也可使用 CREATE TYPE 命令向PostgreSQL添加新類型 。算法
表1是內置的通用數據類型, 「別名」列中是PostgreSQL內部使用的名稱,這是因爲歷史緣由,某些內部使用或已棄用的類型未在此處列出。
此表基本能涵蓋大部分正常的需求,更豐富的數據類型參考下面的明細,部分不經常使用的沒來得及整理先參考官方連接的文檔~~sql
類型名稱 | 別名 | 描述 |
---|---|---|
bigint | int8 | 有符號八字節整數 |
bigserial | serial8 | 自動遞增八字節整數 |
bit (n) | 固定長度的bit字符串 | |
bit varying (n) | varbit (n) | 可變長度的bit字符串 |
boolean | bool | 邏輯布爾值(true / false) |
box | 平面上的矩形框 | |
bytea | 二進制數據(「字節數組」) | |
character (n) | char (n) | 固定長度的字符串 |
character varying (n) | varchar (n) | 可變長度字符串 |
cidr | IPv4或IPv6網絡地址 | |
circle | 平面上的圓圈 | |
date | 日曆日期(年,月,日) | |
double precision | float8 | 雙精度浮點數(8字節) |
inet | IPv4或IPv6主機地址 | |
integer | int, int4 | 有符號的四字節整數 |
interval [ fields ] [ (p) ] | 時間跨度 | |
json | 文本JSON數據 | |
jsonb | 二進制JSON數據 | |
line | 平面上的線 | |
lseg | 平面上的線段 | |
macaddr | MAC(媒體訪問控制)地址 | |
macaddr8 | MAC(媒體訪問控制)地址(EUI-64格式) | |
money | 貨幣金額 | |
numeric (p, s) | decimal (p, s) | 可選精度的精確數字 |
path | 平面上的幾何路徑 | |
pg_lsn | PostgreSQL日誌序列號 | |
point | 平面上的幾何點 | |
polygon | 平面上的閉合的幾何路徑 | |
real | float4 | 單精度浮點數(4個字節) |
smallint | int2 | 簽名的雙字節整數 |
smallserial | serial2 | 自動遞增兩個字節的整數 |
serial | serial4 | 自動遞增四字節整數 |
text | 可變長度字符串 | |
time (p) without time zone | 一天中的時間(沒有時區) | |
time (p) with time zone | timetz | 一天中的時間,含時區 |
timestamp (p) without time zone | 日期和時間(沒有時區) | |
timestamp (p) with time zone | timestamptz | 日期和時間,含時區 |
tsquery | 文本搜索查詢 | |
tsvector | 文本搜索文檔 | |
txid_snapshot | 用戶級事務ID快照 | |
uuid | 廣泛惟一的標識符 | |
xml | XML數據 |
Numeric Types - https://www.postgresql.org/docs/10/static/datatype-numeric.html數據庫
類型名稱 | 存儲大小 | 描述 | 範圍 |
---|---|---|---|
smallint | 2 bytes | 整數(小範圍) | -32768 至 +32767 |
integer | 4 bytes | 整數(經常使用) | -2147483648 至 +2147483647 |
bigint | 8 bytes | 整數(大範圍) | -9223372036854775808 至 +9223372036854775807 |
decimal | variable | 可指定精確精度 | 小數點前最多131072位; 小數點後最多16383位 |
numeric (p,s) | variable | 可指定精確精度 | 小數點前最多131072位; 小數點後最多16383位 |
real | 4 bytes | 精度可變 | 精度至少6位 |
double precision | 8 bytes | 精度可變 | 精度至少15位 |
smallserial | 2 bytes | 自動遞增整數(小範圍) | 1 至 32767 |
serial | 4 bytes | 自動遞增整數 | 1 至 2147483647 |
bigserial | 8 bytes | 自動遞增整數(大範圍) | 1 至 9223372036854775807 |
Monetary Types - https://www.postgresql.org/docs/10/static/datatype-money.htmljson
類型名稱 | 存儲大小 | 描述 | 範圍 |
---|---|---|---|
money | 8 bytes | 貨幣金額,保留2位小數 | -92233720368547758.08 至 +92233720368547758.07 |
money固定小數點後2位,超過2位長度會四捨五入,仔細看會發現金額前面有貨幣類型,這個是根據服務端的lc_monetary設置的。數組
select '12.34567'::money; --------------------- ¥12.35 /*查看貨幣類型*/ show lc_monetary; --------------------- Chinese (Simplified)_People's Republic of China.936 /*重設貨幣類型*/ set lc_monetary='C'; /*再次查詢貨幣,發現貨幣類型改了*/ select '12.34567'::money; --------------------- $12.35
比較坑爹的是lc_monetary的設置是跟着數據庫走的,也就是一個數據庫只能有一種lc_monetary,因此不建議用money類型,改用numeric安全
Character Types - https://www.postgresql.org/docs/10/static/datatype-character.html網絡
類型名稱 | 存儲大小 | 描述 |
---|---|---|
character (n) | n | 若是存儲的值比字段申明長度短,會用空白代替,不聲明長度n默認是1 |
character varying (n) | n | 若是存儲的值比字段申明長度短,不會用空白代替,不聲明長度n表明任意長度 |
text | 任意長度 | 大文本使用 |
"char" | 1 byte | 注意數據類型有引號,非通常用戶用,主要用於內部系統目錄中做爲簡單的枚舉類型 |
name | 64 bytes | 固定長度,非通常用戶用,主要用於內部系統目錄中存儲標識符 |
character實際存儲和顯示的會用空白填充長度,可是比較字符串或者轉換成其餘字符串,填充的空白會被刪除
character varying和text不會默認用空白填充長度,但文本自己尾部有空白的話不會默認去掉,這種空白是有意義的
大多數狀況下,字符串類型通常用character varying或textapp
Binary Data Types - https://www.postgresql.org/docs/10/static/datatype-binary.html函數
類型名稱 | 存儲大小 | 描述 |
---|---|---|
bytea | 1或4個字節加上實際的二進制字符串 | 可變長度二進制字符串 |
bytea 類型支持兩種輸入和輸出格式:"escape" 和 "hex"
輸出格式默認是 「hex」,能夠經過配置參數bytea_output 進行修改,以下代碼第一行,window下實測不改也不影響中文呈現,liunx下可能須要設置
set bytea_output = 'escape'; /* 建立表 */ CREATE TABLE testbytea (sid serial,info bytea); /* 插入數據 */ insert into testbytea(info) values('內容1') /* 若是數據量很大能夠用 || 分批次追加更新內容,更新完後完整內容是 "內容1 hello2" */ update testbytea set info=info||cast(' hello2' as bytea) where sid=1; /* 中文查詢方式1:用默認的解碼方式,再轉一遍utf8能夠直接解決中文呈現問題 */ select sid,convert_from(info, 'utf8') from testbytea; -------+------------- 1 | 內容1 hello2 /* 中文查詢方式2: 指定解碼方式直接查詢,中文顯示有問題,字母和數字正常 */ select sid,encode(info,'escape')as info from testbytea; --------+------------ 1 | \345\206\205\345\256\2711 hello2 /* 中文查詢方式2:注意convert_from無法直接放在上面的encode裏嵌套,須要複製下文本再轉換一下utf8 */ SELECT convert_from('\345\206\205\345\256\2711 hello2', 'utf8'); --------------------- 內容1 hello2
Date/Time Types - https://www.postgresql.org/docs/10/static/datatype-datetime.html
類型名稱 | 存儲大小 | 描述 | 最小值 | 最大值 | 最小精度 |
---|---|---|---|---|---|
timestamp (p) without time zone | 8 bytes | 日期和時間 (不含時區) | 公元前 4713年 | 公元 294276年 | 微秒 |
timestamp (p) with time zone | 8 bytes | 日期和時間 (含時區) | 公元前 4713年 | 公元 294276年 | 微秒 |
date | 4 bytes | 日期,不含時間 | 公元前 4713年 | 公元 5874897年 | 天 |
time (p) without time zone | 8 bytes | 時間,不含日期 (不含時區) | 00:00:00 | 24:00:00 | 微秒 |
time (p) with time zone | 12 bytes | 時間,不含日期 (含時區) | 00:00:00+1459 | 24:00:00-1459 | 微秒 |
interval [ fields ] (p) | 16 bytes | 時間間隔 | -178000000 年 | 178000000 年 | 微秒 |
timestamp若是隻填寫時間則認爲沒有時區,時區做爲一個可選參數
time、timestamp和interval接受一個可選的精度值p,指在seconds中保留的小數位數,默認沒有限制但不能超過6 ( 注意: p範圍是0到6 )
/*沒有時區,p>6時的結果與p=6結果一致。使用pgAdmin添加timestamp字段時提示長度不能大於9是錯誤的,應是不能大於6*/ select timestamp(6) without time zone '2018-08-01 12:01:01.12345678910'; --------------------- 2018-08-01 12:01:01.123457 /*有時區 */ select timestamp(6) with time zone '2018-08-01 12:01:01.12345678910'; --------------------- 2018-08-01 12:01:01.123457+08
interval 類型有一個附加選項,它經過編寫如下短語之一來限制存儲字段集:
YEAR MONTH DAY HOUR MINUTE SECOND YEAR TO MONTH DAY TO HOUR DAY TO MINUTE DAY TO SECOND HOUR TO MINUTE HOUR TO SECOND MINUTE TO SECOND
Boolean Type Types - https://www.postgresql.org/docs/10/static/datatype-boolean.html
類型名稱 | 存儲大小 | 描述 |
---|---|---|
boolean | 1 bytes | true 或 false |
true狀態的有效字符爲: TRUE 't' 'true' 'y' 'yes' 'on' '1'
false狀態的有效字符爲: FALSE 'f' 'false' 'n' 'no' 'off' '0'
Enumerated Types - https://www.postgresql.org/docs/10/static/datatype-enum.html
使用CREATE TYPE命令建立枚舉類型
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); CREATE TABLE person ( name text, current_mood mood ); INSERT INTO person VALUES ('Moe', 'happy'); SELECT * FROM person WHERE current_mood = 'happy'; name | current_mood ------+-------------- Moe | happy (1 row)
和代碼裏的枚舉相似,每一個枚舉有對應的一個值,因此能夠實現 WHERE current_mood > 'sad' (查出'ok' 和 'happy') 或者 ORDER BY current_mood DESC (根據枚舉對應的值進行排序,非字符串)
Geometric Types - https://www.postgresql.org/docs/10/static/datatype-geometric.html
類型名稱 | 存儲大小 | 描述 | 示例 |
---|---|---|---|
point | 16 bytes | 平面座標 | (x,y) |
line | 32 bytes | 無窮線 | {A,B,C} |
lseg | 32 bytes | 線段 | ((x1,y1),(x2,y2)) |
box | 32 bytes | 矩形框 | ((x1,y1),(x2,y2)) |
path | 16+16n bytes | 多邊形封閉路徑 | ((x1,y1),...) |
path | 16+16n bytes | 開放路徑 | [(x1,y1),...] |
polygon | 40+16n bytes | 多邊形(相似封閉路徑) | ((x1,y1),...) |
circle | 24 bytes | 圓形 | <(x,y),r> (center point and radius) |
Network Address Types - https://www.postgresql.org/docs/10/static/datatype-net-types.html
類型名稱 | 存儲大小 | 描述 |
---|---|---|
cidr | 7 or 19 bytes | IPv4 and IPv6 networks |
inet | 7 or 19 bytes | IPv4 and IPv6 hosts and networks |
macaddr | 6 bytes | MAC addresses |
macaddr8 | 8 bytes | MAC addresses (EUI-64 format) |
Bit String Types - https://www.postgresql.org/docs/10/static/datatype-bit.html
Network Address Types - https://www.postgresql.org/docs/10/static/datatype-net-types.html
Text Search Types - https://www.postgresql.org/docs/10/static/datatype-textsearch.html
tsvector:類型表示以文本搜索優化的形式的文檔
tsquery:類型相似地表示文本查詢
UUID Type - https://www.postgresql.org/docs/10/static/datatype-uuid.html
此數據類型稱爲全局惟一標識符,或稱爲GUID,此標識符是128位數量,由選擇的算法生成,其餘人不基本不可能生成相同的惟一標識。
示例標識符以下:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11 {a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} a0eebc999c0b4ef8bb6d6bb9bd380a11 a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11 {a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
XML Type - https://www.postgresql.org/docs/10/static/datatype-xml.html
用於存儲XML數據, 它與在文本字段中直接存儲XML數據的優點是它會檢查輸入值的格式是否正確,而且有支持函數對其執行類型安全操做;
JSON Type - https://www.postgresql.org/docs/10/static/datatype-json.html
此類數據也能夠存儲爲text,但JSON數據類型的優勢是能夠根據JSON規則強制每一個存儲的值有效。還有各類特定於JSON的函數和運算符可用於存儲在這些數據類型中的數據,JSON有兩種數據類型 json和jsonb,兩種類型的主要區別是效率:
json:能夠理解爲純文本插入,插入效率高,實際解析時候須要從新執行分析
jsonb:存儲爲二進制,插入效率略慢,但處理要快不少,由於不須要從新分析,且jsonb還支持索引,通常大部分程序會使用jsonb。
Arrays - https://www.postgresql.org/docs/10/static/arrays.html
Composite Types- https://www.postgresql.org/docs/10/static/rowtypes.html
Range Types- https://www.postgresql.org/docs/10/static/rangetypes.html
Object Identifier Types - https://www.postgresql.org/docs/10/static/datatype-oid.html
pg_lsn Type - https://www.postgresql.org/docs/10/static/datatype-pg-lsn.html
Pseudo-Types - https://www.postgresql.org/docs/10/static/datatype-pseudo.html