SQL Server 數據類型繁多,字符串、日期時間、整數、定點/浮點數各有細分,選型失誤易導致存儲浪費、隱式轉換、精度丟失甚至截斷錯誤。本文對五大易混淆類型族進行對比解析,給出選型決策表。
1. 字符串族:char/varchar/text vs nchar/nvarchar/ntext
| 類型 | 長度範圍 | 存儲特性 | 適用場景 |
| char(n) | 1-8000 | 定長,不足右補空格 | 固定長度代碼(如身份證、郵編) |
| varchar(n) | 1-8000 | 變長,實際長度+2字節開銷 | 通用可變字符串(姓名、地址) |
| text | ≤ 2^31-1 字符 | LOB,舊類型,不推薦新開發使用 | 超長非 Unicode 文本(遷移維護) |
| nchar(n) | 1-4000 | 定長 Unicode,每字符 2 字節 | 固定長度多語言代碼 |
| nvarchar(n) | 1-4000 | 變長 Unicode | 通用多語言字符串(首選) |
| ntext | ≤ 2^30-1 字符 | LOB,舊類型,不推薦 | 超長 Unicode 文本(遷移維護) |
現代最佳實踐:優先 nvarchar(max) / varchar(max) 替代 text/ntext/image,支援完整函數操作、索引(過濾索引)、壓縮。
2. 日期時間族:datetime vs smalldatetime
| 類型 | 範圍 | 精度 | 存儲 | 建議 |
| datetime | 1753-01-01 ~ 9999-12-31 | 3.33 ms | 8 字節 | 通用業務時間,歷史數據回溯 |
| smalldatetime | 1900-01-01 ~ 2079-06-06 | 1 分鐘 | 4 字節 | 僅需分鐘粒度、空間敏感場景 |
| date | 0001-01-01 ~ 9999-12-31 | 天 | 3 字節 | 2008+ 新類型,僅存日期 |
| time | 00:00:00.0000000 ~ 23:59:59.9999999 | 100 ns | 3-5 字節 | 2008+ 新類型,僅存時間 |
| datetime2 | 0001-01-01 ~ 9999-12-31 | 100 ns | 6-8 字節 | 2008+ 首選,範圍更廣、精度更高 |
| datetimeoffset | 同 datetime2 + 時區 | 100 ns | 8-10 字節 | 跨時區應用必備 |
3. 整數族:bigint / int / smallint / tinyint / bit
| 類型 | 範圍 | 存儲 | 典型用途 |
| bigint | -2^63 ~ 2^63-1 | 8 字節 | 極大標識(如交易流水號) |
| int | -2^31 ~ 2^31-1 | 4 字節 | 主鍵身份列、通用計數(首選) |
| smallint | -32,768 ~ 32,767 | 2 字節 | 小範圍枚舉、狀態碼 |
| tinyint | 0 ~ 255 | 1 字節 | 極小非負計數、標誌位 |
| bit | 0/1/NULL | 1 位(表級壓縮存8列=1字節) | 布爾標誌 |
原則:剛好夠用最小,身份列首選 int IDENTITY(1,1),超 21 億再改 bigint。
4. 定點數族:decimal / numeric(完全等效)
- 語法:
decimal(p, s) 或 numeric(p, s)。
p(精度):1-38,所有數字總位數。
s(小數位):0-p,小數點右側位數。
- 存儲:按
p 分級(1-9:5B, 10-19:9B, 20-28:13B, 29-38:17B)。
- 用途:金額、匯率、精度敏感計算,杜絕浮點誤差。
5. 浮點數族:float / real
| 類型 | 範圍(近似) | 精度 | 存儲 | 備註 |
| float(n) | ±1.79E308 | n 位二進制精度(1-53),默認 53 | 8 字節 | float(24) 等同 real |
| real | ±3.40E38 | 24 位二進制精度(約 7 位十進制) | 4 字節 | 單精度 |
警告:浮點數為近似值,禁止用於金融金額比較/匯總,僅限科學計算、圖形坐標等容差場景。
選型決策速查表
| 業務需求 | 推薦類型 | 避坑提示 |
| 多語言文本、長度不定 | nvarchar(max) | 勿用 ntext |
| 純 ASCII、極長文本 | varchar(max) | 勿用 text |
| 日期時間、需毫秒、跨世紀 | datetime2(3) | 勿用舊 datetime |
| 僅日期/僅時間 | date / time | 分離存儲更省空間 |
| 主鍵自增 | int IDENTITY | 預估超 21 億用 bigint |
| 金額、匯率、精確計算 | decimal(19,4) / (38,10) | 嚴禁 float/real |
| 科學計算、座標、容差 | float / real | 理解近似值語義 |