資料類型定義了欄位、預存程序參數與區域變數的資料特徵,決定儲存格式並代表不同資訊類型。SQL Server 將資料類型分為系統資料類型(內建)與使用者定義資料類型(基於系統類型擴充)兩大類。本文系統整理各類型特性、分類、宣告語法與實戰注意事項。
系統資料類型分類總覽
1. 二進制類型
儲存原始位元組資料(如檔案流、雜湊值、加密輸出),字元範圍 0-9、A-F/a-f,以 0x 前綴標識,每兩字元為一位元組(如 0xF5)。
| 類型 | 語法 | 長度範圍 | 儲存特性 |
| 定長 | binary[(n)] | 1-8,000 位元組 | 固定佔用 n 位元組,不足右補 0x00,超長截斷 |
| 變長 | varbinary[(n)] | 1-8,000 位元組 / max 至 2 GB | 實際長度 + 2 位元組開銷,超長截斷 |
DECLARE @v1 binary(10) = 0x10FFAA; -- 實際儲存 0x10FFAA00000000000000
DECLARE @v2 varbinary(64) = 0x10FFAA; -- 實際儲存 0x10FFAA(3 位元組)
長度參數 n 的預設值陷阱:
- 宣告變數/定義欄位時省略
n → 預設 1 位元組
CONVERT/CAST 轉換時省略 n → 預設 30 位元組
2. 字元字串類型
輸入時須以單引號括住。同樣分定長與變長:
char[(n)]:定長,固定 n 位元組,不足右補空格
varchar[(n)]:變長,實際長度 + 2 位元組開銷
nchar/nvarchar:Unicode 版本,每字元 2 位元組,支援多國語系
max 指定子:最大 2 GB(varchar(max)、nvarchar(max))
3. 日期時間類型
| 類型 | 儲存大小 | 範圍 | 精度 | 建議用途 |
datetime | 8 位元組 | 1753-01-01 ~ 9999-12-31 | 3.33 毫秒 | 舊版相容 |
smalldatetime | 4 位元組 | 1900-01-01 ~ 2079-06-06 | 1 分鐘 | 輕量需求 |
date | 3 位元組 | 0001-01-01 ~ 9999-12-31 | 1 天 | 純日期(SQL 2008+) |
time | 3-5 位元組 | 00:00:00.0000000 ~ 23:59:59.9999999 | 100 奈秒 | 純時間(SQL 2008+) |
datetime2 | 6-8 位元組 | 0001-01-01 ~ 9999-12-31 | 100 奈秒 | 新開發首選 |
datetimeoffset | 8-10 位元組 | 含時區位移 | 100 奈秒 | 跨時區應用 |
4. 整數類型
| 類型 | 儲存大小 | 範圍 |
bigint | 8 位元組 | -2^63 ~ 2^63-1 |
int | 4 位元組 | -2^31 ~ 2^31-1 |
smallint | 2 位元組 | -32,768 ~ 32,767 |
tinyint | 1 位元組 | 0 ~ 255 |
5. 精確數值類型
適用財務、工程等不可容忍捨入誤差的場景:
decimal[(p[,s])] / numeric[(p[,s])](兩者同義)
p(精度):有效數字總位數(1-38)
s(小數位數):小數點右邊位數(0-p)
- 儲存大小隨精度變化:1-9 位→5 位元組,10-19→9,20-28→13,29-38→17
6. 近似數值類型
科學計算、浮點運算,有捨入誤差:
float[(n)]:n 為位元精度(1-53),1-24 相當 real(4 位元組,7 位有效數字),25-53 為 float(8 位元組,15 位有效數字)
real:float(24) 別名
7. 貨幣類型
| 類型 | 儲存大小 | 範圍 | 小數位 |
money | 8 位元組 | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 | 固定 4 位 |
smallmoney | 4 位元組 | -214,748.3648 ~ 214,748.3647 | 固定 4 位 |
⚠️ 貨幣類型實際為整數除以 10,000 實作,大量運算時精度優於 float,但除法運算仍可能產生捨入,財務系統建議改用 decimal(19,4)。
8. 位元類型
bit:僅儲存 0 或 1,任何非零輸入視為 1
- 單欄 1 位元,但資料表中 8 個
bit 欄位合併儲存為 1 位元組
9. 時間戳記 / Rowversion
timestamp(同義 rowversion):資料庫唯一、自動遞增的二進制數,不儲存日期時間
- 每次資料列更新自動重新產生,用於樂觀並發控制與資料同步
- 每張表僅能擁有一個
timestamp 欄位
10. 大型物件類型(LOB)
| 類型 | 用途 | 輸入格式 | 最大長度 | 備註 |
text | 大量非 Unicode 文字 | 單引號括住 | 2 GB | 已淘汰,改用 varchar(max) |
ntext | 大量 Unicode 文字 | 單引號括住 | 1 GB 字元 | 已淘汰,改用 nvarchar(max) |
image | 二進位大物件(圖片、檔案) | 0x 前綴 | 2 GB | 已淘汰,改用 varbinary(max) |
識別碼命名規則
- 長度 1-128 字元(舊版 30 字元限制已放寬)
- 首字元須為字母、
_、@、#:
@ 開頭:區域變數/參數
# 開頭:暫存物件(單 # 區域暫存,雙 ## 全域暫存)
- 後續字元可為字母、數字、
_、@、$、#
- 預設不允許空格與保留關鍵字,但可用雙引號
" 或方括號 [] 包住定義特殊識別碼(需 QUOTED_IDENTIFIER ON)
選型建議速查表
| 場景 | 推薦類型 | 避免使用 |
| 主鍵/身分識別 | int / bigint + IDENTITY | uniqueidentifier(除非分散式) |
| 金額/匯率/精確計算 | decimal(19,4) 或更高精度 | float/real/money |
| 一般字串(新專案) | nvarchar(n) / nvarchar(max) | char/varchar(除非純 ASCII 高效能) |
| 日期時間(新專案) | datetime2 / date / time | datetime/smalldatetime |
| 布林旗標 | bit | tinyint/char(1) |
| 大型文字/文件 | nvarchar(max) / varchar(max) | text/ntext |
| 二進位檔案/圖片 | varbinary(max) | image |
| 樂觀並發/版本戳 | rowversion | datetime 模擬 |