| 資料類型 | 儲存大小 | 範圍 | 適用場景 |
|---|---|---|---|
| bigint | 8 bytes | -2^63 ~ 2^63-1 (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807) |
超大整數、遞增 ID 預估超過 21 億、時間戳毫秒數 |
| int | 4 bytes | -2^31 ~ 2^31-1 (-2,147,483,648 ~ 2,147,483,647) |
預設首選,一般整數、主鍵 ID、計數器 |
| smallint | 2 bytes | -32,768 ~ 32,767 | 狀態碼、年份、小範圍計數 |
| tinyint | 1 byte | 0 ~ 255 | 布林旗標(0/1)、枚舉值、百分比、極小計數 |
在運算式中混用類型時,SQL Server 依優先序自動提升:
bigint > smallmoney > int > smallint > tinyint
重要:tinyint/smallint/int 不會自動提升為 bigint,除非運算式明確包含 bigint 參數。
bigint 時,函數返回 bigintint| 陷阱 | 後果 | 解法 |
|---|---|---|
| IDENTITY 使用 int,資料量超過 21 億 | 插入失敗,錯誤 8115 | 預估超過 10 億筆直接用 bigint |
| tinyint 存負數 | 溢位錯誤 | 改用 smallint 或 int |
| 混合運算導致隱含轉換 | 索引失效、效能下降 | 統一參數類型,避免 CAST |
| 前端語言 long 對應 bigint | C# long、Java long 皆 8 bytes,完美對應 | ORM 映射正確設定 |
假設 1 億筆資料:
int:~ 400 MBsmallint:~ 200 MB(省 50%)tinyint:~ 100 MB(省 75%)大型資料表選擇窄類型,可顯著降低記憶體壓力、備份時間與 I/O 成本。