資料庫設計時型別選擇錯誤會導致資料截斷、效能低落、儲存空間浪費。本文整理 SQL Server 2000/2005+ 核心資料型別的關鍵差異、適用場景與選擇決策樹。
一、 字串型別:char vs varchar vs text (及 n 前綴 Unicode 版)
| 型別 | 長度範圍 | 儲存特性 | 適用場景 |
char(n) | 1-8000 | 固定長度,不足右側補空格 | 固定長代碼 (身分證字號、國別碼、MD5 雜湊) |
varchar(n) | 1-8000 | 變動長度,實際長度 + 2 Bytes 額外負擔 | 一般可變字串 (姓名、地址、描述) |
text | 0-2^31-1 (2GB) | LOB 儲存,指標在資料列,**已淘汰** | 舊系統大量文字,**新版請用 varchar(max)** |
nchar/nvarchar/ntext | 1-4000 / 0-2^30-1 | Unicode (雙位元組),中英同長度 | **多語系系統預設首選**,避免編碼轉換 Bug |
選擇決策
- 需支援多語系/中文 → **直接用 nvarchar** (4000 字元內) 或
nvarchar(max)
2. 純 ASCII、固定長 → char
3. 純 ASCII、可變長 → varchar
4. > 8000 位元組 → varchar(max) / nvarchar(max) (SQL 2005+)
二、 日期時間:datetime vs smalldatetime
| 型別 | 範圍 | 精度 | 儲存大小 | 建議 |
datetime | 1753-01-01 ~ 9999-12-31 | 3.33 毫秒 | 8 Bytes | 通用首選 |
smalldatetime | 1900-01-01 ~ 2079-06-06 | 1 分鐘 | 4 Bytes | 僅需分鐘精度、節省空間的舊系統 |
date/time/datetime2/datetimeoffset | 更大範圍/更高精度/時區感知 | 100 奈秒 / 含時區 | 3-10 Bytes | **SQL 2008+ 新專案首選** |
三、 整數家族:bigint → int → smallint → tinyint → bit
| 型別 | 範圍 | 大小 | 典型用途 |
bigint | -2^63 ~ 2^63-1 | 8 Bytes | 超大流水號、外部系統 64-bit ID |
int | -2^31 ~ 2^31-1 | 4 Bytes | **主鍵、外鍵、一般計數首選** |
smallint | -32,768 ~ 32,767 | 2 Bytes | 狀態碼、小範圍枚舉、年齡 |
tinyint | 0 ~ 255 | 1 Byte | 布林旗標 (0/1/2)、極小枚舉 |
bit | 0/1/NULL | 1 Bit (8 個 bit 共 1 Byte) | True/False 旗標 |
**原則**:能用 tinyint 就不用 smallint,能用 smallint 就不用 int,但主鍵/外鍵統一用 int (或 bigint) 避免隱含轉換與 Join 效能損失。
四、 精確數值:decimal(p,s) = numeric(p,s)
- 兩者**完全等效**,
decimal 為 ANSI 標準關鍵字,建議統一用 decimal
p (precision):總位數 (1-38),含小數點左右
s (scale):小數位數 (0-p),預設 0
- 範例:
decimal(18,4) 可存 ±999,999,999,999,999.9999 (金融金額首選)
- **嚴禁用 float/real 存金額** (二進位浮點無法精確表示 0.1)
五、 近似數值:float vs real
| 型別 | 範圍 | 精度 | 大小 | 同義詞 |
float(n) | ±1.79E308 | 15 位有效數字 (n=53) | 8 Bytes | float(53) = float |
real | ±3.40E38 | 7 位有效數字 | 4 Bytes | float(24) |
適用:科學計算、統計模型、座標、感測器數據。**不適用**:金融、會計、精確比較。
六、 快速選型決策樹 (列印版)
資料性質
├─ 文字
│ ├─ 多語系/含中文 → nvarchar(max) / nvarchar(4000)
│ ├─ 純 ASCII
│ │ ├─ 固定長 → char(n)
│ │ └─ 可變長 → varchar(n) / varchar(max)
│ └─ >2GB → FILESTREAM / FileTable / Blob Storage
├─ 日期時間
│ ├─ 需時區 → datetimeoffset
│ ├─ 高精度/大範圍 → datetime2
│ └─ 一般 → datetime
├─ 整數
│ ├─ >21億 → bigint
│ ├─ 主鍵/外鍵 → int
│ ├─ 狀態/枚舉 → tinyint/smallint
│ └─ True/False → bit
├─ 精確數值 (金額/量測) → decimal(p,s)
└─ 近似數值 (科學/統計) → float / real
- 上一篇文章: SQL Server 2000 + JDBC 整合常見問題與解決方案:驅動選擇、連線池、字元編碼完整指南
- 下一篇文章: SQL Server 依年、月、星期、第 N 週計算具體日期函數:RequestDate 完整實作
Copyright ©
程式碼之家 All Rights Reserved