PostgreSQL 數據類型轉換完整指南
自 PostgreSQL 8.3 版本起,資料庫取消了欄位數據之間的預設隱式轉換機制。若需進行數據類型轉換,開發者必須顯式使用 :: 操作符,其底層實際調用的是 CAST 函數。那麼,究竟哪些數據類型之間可以相互轉換?答案藏在系統目錄表 pg_cast 中。
核心機制:pg_cast 系統表
pg_cast 表記錄了所有合法的類型轉換路徑。透過查詢此表,我們可以獲得當前資料庫版本支援的完整類型轉換對照表。以下為常見類型轉換關係摘要(來源類型 → 目標類型):
- 數值類型轉換:int8、int2、int4、float4、float8、numeric 之間雙向轉換
- 布林與 OID 類型:bool ↔ int4/int8、oid ↔ int2/int4/int8
- 系統物件識別符:regproc、regprocedure、regoper、regoperator、regclass、regtype、regconfig、regdictionary 均可與 int2/int8 互轉
- 字串類型家族:text、varchar、bpchar、char、name 之間完整互轉
- 日期時間類型:date、time、timestamp、timestamptz、interval、reltime、abstime 靈活互轉
- 幾何類型:point、lseg、path、box、polygon、circle 具備豐富轉換路徑
- 網路與位元類型:inet、cidr、bit、varbit 與 int4/int8/text 互轉
- XML 與 JSON 相關:xml 可與 varchar、bpchar、text 互轉
實務建議
雖然 :: 語法簡潔(如 SELECT '123'::int),但在需要符合 SQL 標準或跨資料庫遷移時,建議使用標準 CAST(expr AS type) 語法。開發前務必查閱 pg_cast 確認目標版本支援的轉換路徑,避免運行時拋出 cannot cast type A to type B 錯誤。