Rick's DevNotes
筆記關於我作品集
筆記類別
  • 全部
  • DockerDocker
  • NetworkNetwork
  • RxJSRxJS
  • NginxNginx
  • TypeScriptTypeScript
  • Data_Structure_And_AlgorithmData Structure And Algorithm
  • JavaScriptJavaScript
  • PostgreSQLPostgreSQL
  • ReactReact
  • GitGit

© 2026 Rick's DevNotes. All rights reserved.

# SQL# Type

建立時間:2024/08/18

PostgreSQL 筆記 - 資料型別

概述

資料型別(Data Types)是資料庫設計的基礎。選擇正確的資料型別關係到查詢效能和資料完整性。

Numbers Types(數字型別)

1. 整數型別(無小數點)

型別儲存大小範圍
smallint2 bytes-32,768 到 +32,767
integer4 bytes-2,147,483,648 到 +2,147,483,647
bigint8 bytes-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807

2. 浮點數型別(有小數點)

型別儲存大小精度 / 範圍
decimal變動最多 131,072 位於小數點前,16,383 位於小數點後
numeric變動同 decimal,為精確數值型
real4 bytes約 6 位有效數字,範圍 1E-37 到 1E37
double precision8 bytes約 15 位有效數字,範圍 1E-307 到 1E308
float4 或 8 bytes等同於 real 或 double precision,依實現細節而定

3. 自動遞增型別(無小數點,自動遞增)

型別儲存大小範圍
smallserial2 bytes1 到 32,767
serial4 bytes1 到 2,147,483,647
bigserial8 bytes1 到 9,223,372,036,854,775,807

使用情境

以下是選擇數字型別的情境建議:

Primary Key 欄位

  • 建議:使用 SERIAL
  • 原因:自動遞增,適合大多數情況

整數

  • 建議:使用 INTEGER
  • 原因:平衡儲存空間和範圍需求

高精度小數(金融、科學計算)

  • 建議:使用 NUMERIC 或 DECIMAL
  • 適用場景:銀行餘額、黃金重量、科學計算
  • 優點:精確計算,無浮點數誤差

一般精度小數

  • 建議:使用 DOUBLE PRECISION
  • 適用場景:垃圾場垃圾重量、湖泊水量、輪胎氣壓
  • 優點:計算速度快,適合統計分析

精度差異示範

浮點數型別(可能有精度誤差):

精確數值型別(無精度誤差):

重要差異:浮點數型別追求效能,精確數值型別追求準確性。


Character Types(字元型別)

字元型別對照表

型別說明
CHAR(n)固定長度字串,不足部分會以空格填充
VARCHAR(n)變動長度字串,最多 n 個字元,超出部分自動截斷
VARCHAR變動長度字串,無長度限制
TEXT變動長度字串,無長度限制

💡 效能提醒:這些字元型別之間沒有效能差異,選擇主要基於業務需求。

使用建議

固定長度資料

  • 使用:CHAR(n)
  • 適用:國家代碼、產品編號
  • 範例:country_code CHAR(2) -- 'TW', 'US'

有長度限制的變動字串

  • 使用:VARCHAR(n)
  • 適用:使用者名稱、電子郵件
  • 範例:username VARCHAR(50)

長文本內容

  • 使用:TEXT
  • 適用:文章內容、描述欄位
  • 範例:article_content TEXT

Boolean Types(布林型別)

布林值對應表

輸入值結果
true, 'yes', 'on', 1, 't', 'y'TRUE
false, 'no', 'off', 0, 'f', 'n'FALSE
nullNULL

使用範例


Date Types(日期時間型別)

DATE(日期型別)

支援多種輸入格式,以下都會解析為 1980年11月20日:

輸入格式解析結果
'1980-11-20'1980年11月20日
'Nov-20-1980'1980年11月20日
'20-Nov-1980'1980年11月20日
'1980-November-20'1980年11月20日
'November 20, 1980'1980年11月20日

TIME(時間型別)

輸入格式解析結果
'01:23 AM'01:23:00
'05:23 PM'17:23:00
'23:12'23:12:00

TIME WITH TIME ZONE(含時區的時間)

輸入格式解析結果
'01:23 AM EST'01:23:00-05:00
'05:23 PM PST'17:23:00-08:00
'05:23 PM UTC'17:23:00+00:00

INTERVAL(時間間隔)

輸入格式解析結果
'1 day'1 day
'1 D 20 H 30 M 45 S'1 day 20:30:45
'2 weeks'14 days
'3 months'3 mons

日期時間使用建議

純日期儲存

  • 使用:DATE
  • 適用:生日、事件日期
  • 格式:'YYYY-MM-DD'

含時間的日期

  • 使用:TIMESTAMP
  • 適用:記錄建立時間、更新時間
  • 建議:加上 DEFAULT CURRENT_TIMESTAMP

跨時區應用

  • 使用:TIMESTAMP WITH TIME ZONE
  • 適用:國際化應用、多時區系統
  • 優點:自動處理時區轉換

時間間隔計算

  • 使用:INTERVAL
  • 適用:持續時間、年齡計算
  • 範例:age('2023-01-01', '1990-05-15')

參考資料

  • SQL and PostgreSQL: The Complete Developer's Guide