首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 易混淆數據類型全解析:char/varchar/text、datetime、整數族、decimal/float

     編輯:關於SqlServer

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

類型範圍精度存儲建議
datetime1753-01-01 ~ 9999-12-313.33 ms8 字節通用業務時間,歷史數據回溯
smalldatetime1900-01-01 ~ 2079-06-061 分鐘4 字節僅需分鐘粒度、空間敏感場景
date0001-01-01 ~ 9999-12-31天3 字節2008+ 新類型,僅存日期
time00:00:00.0000000 ~ 23:59:59.9999999100 ns3-5 字節2008+ 新類型,僅存時間
datetime20001-01-01 ~ 9999-12-31100 ns6-8 字節2008+ 首選,範圍更廣、精度更高
datetimeoffset同 datetime2 + 時區100 ns8-10 字節跨時區應用必備

3. 整數族:bigint / int / smallint / tinyint / bit

類型範圍存儲典型用途
bigint-2^63 ~ 2^63-18 字節極大標識(如交易流水號)
int-2^31 ~ 2^31-14 字節主鍵身份列、通用計數(首選)
smallint-32,768 ~ 32,7672 字節小範圍枚舉、狀態碼
tinyint0 ~ 2551 字節極小非負計數、標誌位
bit0/1/NULL1 位(表級壓縮存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.79E308n 位二進制精度(1-53),默認 538 字節float(24) 等同 real
real±3.40E3824 位二進制精度(約 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理解近似值語義
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved