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

SQL Server 易混淆資料型別完整對照:char/varchar/text、datetime/smalldatetime、整數家族、decimal/numeric、float/real

     編輯:關於SqlServer

資料庫設計時型別選擇錯誤會導致資料截斷、效能低落、儲存空間浪費。本文整理 SQL Server 2000/2005+ 核心資料型別的關鍵差異、適用場景與選擇決策樹。

一、 字串型別:char vs varchar vs text (及 n 前綴 Unicode 版)

型別長度範圍儲存特性適用場景
char(n)1-8000固定長度,不足右側補空格固定長代碼 (身分證字號、國別碼、MD5 雜湊)
varchar(n)1-8000變動長度,實際長度 + 2 Bytes 額外負擔一般可變字串 (姓名、地址、描述)
text0-2^31-1 (2GB)LOB 儲存,指標在資料列,**已淘汰**舊系統大量文字,**新版請用 varchar(max)**
nchar/nvarchar/ntext1-4000 / 0-2^30-1Unicode (雙位元組),中英同長度**多語系系統預設首選**,避免編碼轉換 Bug

選擇決策

  1. 需支援多語系/中文 → **直接用 nvarchar** (4000 字元內) 或 nvarchar(max)
  2. 2. 純 ASCII、固定長 → char 3. 純 ASCII、可變長 → varchar 4. > 8000 位元組 → varchar(max) / nvarchar(max) (SQL 2005+)

二、 日期時間:datetime vs smalldatetime

型別範圍精度儲存大小建議
datetime1753-01-01 ~ 9999-12-313.33 毫秒8 Bytes通用首選
smalldatetime1900-01-01 ~ 2079-06-061 分鐘4 Bytes僅需分鐘精度、節省空間的舊系統
date/time/datetime2/datetimeoffset更大範圍/更高精度/時區感知100 奈秒 / 含時區3-10 Bytes**SQL 2008+ 新專案首選**

三、 整數家族:bigint → int → smallint → tinyint → bit

型別範圍大小典型用途
bigint-2^63 ~ 2^63-18 Bytes超大流水號、外部系統 64-bit ID
int-2^31 ~ 2^31-14 Bytes**主鍵、外鍵、一般計數首選**
smallint-32,768 ~ 32,7672 Bytes狀態碼、小範圍枚舉、年齡
tinyint0 ~ 2551 Byte布林旗標 (0/1/2)、極小枚舉
bit0/1/NULL1 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

適用:科學計算、統計模型、座標、感測器數據。**不適用**:金融、會計、精確比較。

六、 快速選型決策樹 (列印版)

資料性質
├─ 文字
│  ├─ 多語系/含中文 → 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
型別範圍精度大小同義詞
float(n)±1.79E30815 位有效數字 (n=53)8 Bytesfloat(53) = float
real±3.40E387 位有效數字4 Bytesfloat(24)