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

SQL Server 2005 char/nchar/varchar/nvarchar 型別差異與選用指南

     編輯:SQL Server 2005

官方定義速查 (摘自 SQL Server 2005 聯機叢書)

型別長度特性字元集儲存大小適用場景
char(n)固定長度 1~8,000非 Unicoden 位元組資料長度幾乎固定(如代碼、MD5、身分證字號)
varchar(n|max)可變長度 1~8,000 / max=2^31-1非 Unicode實際資料長度 + 2 位元組長度變化大、可能超過 8,000 位元組
nchar(n)固定長度 1~4,000Unicode (UCS-2)2n 位元組多語系、固定長度 Unicode 資料
nvarchar(n|max)可變長度 1~4,000 / max=2^31-1Unicode (UCS-2)2 × 實際字元數 + 2 位元組多語系、長度變化大、通用首選

關鍵差異總結

  • Unicode vs 非 Unicode:n* 型別支援多國語言(中日韓等),儲存大小為字元數 × 2 位元組;char/varchar 依資料庫排序規則代碼頁,跨語系易產生亂碼或資料截斷。
  • 固定 vs 可變:固定長度 (char/nchar) 不足補空白,查詢需注意 RTRIM;可變長度 (varchar/nvarchar) 僅佔實際大小,索引統計資訊更準確。
  • max 指定:varchar(max)/nvarchar(max) 取代舊版 text/ntext,支援大物件 (LOB) 儲存,可參與大多數字串函數運算。

實測腳本與結果


DECLARE @a CHAR(6) = '您啊啊啊啊是';   PRINT 'char:' + @a;   -- char:您啊啊
DECLARE @b CHAR(6) = 'abcdefg';          PRINT 'char:' + @b;   -- char:abcdef
DECLARE @c CHAR(6) = '123456';           PRINT 'char:' + @c;   -- char:123456

DECLARE @d NCHAR(6) = N'您啊啊啊啊是';  PRINT 'nchar:' + @d;  -- nchar:您啊啊啊啊是
DECLARE @e NCHAR(6) = N'abcdefg';        PRINT 'nchar:' + @e;  -- nchar:abcdef
DECLARE @f NCHAR(6) = N'123456';         PRINT 'nchar:' + @f;  -- nchar:123456

DECLARE @g VARCHAR(6) = '您啊啊啊啊是';  PRINT 'varchar:' + @g; -- varchar:您啊啊
DECLARE @h VARCHAR(6) = 'abcdefg';       PRINT 'varchar:' + @h; -- varchar:abcdef
DECLARE @i VARCHAR(6) = '123456';        PRINT 'varchar:' + @i; -- varchar:123456

DECLARE @j NVARCHAR(6) = N'您啊啊啊啊是'; PRINT 'nvarchar:' + @j; -- nvarchar:您啊啊啊啊是
DECLARE @k NVARCHAR(6) = N'abcdefg';      PRINT 'nvarchar:' + @k; -- nvarchar:abcdef
DECLARE @l NVARCHAR(6) = N'123456';       PRINT 'nvarchar:' + @l; -- nvarchar:123456

結果分析

  • char/varchar(6) 以**位元組**計長:中文字佔 2 位元組,故「您啊啊啊啊是」(6 字 = 12 位元組) 截取前 6 位元組 → 「您啊啊」。
  • nchar/nvarchar(6) 以**字元**計長:同樣 6 字完整保留「您啊啊啊啊是」。
  • 純 ASCII (英文/數字) 時,位元組數 = 字元數,四者表現一致。

選用決策樹

  1. 需支援多語系/表情符號/特殊符號 → nvarchar(預設首選)。
  2. 確定僅存 ASCII(代碼、URL、Base64、哈希值)且長度固定 → char。
  3. 確定僅存 ASCII 且長度變化大 → varchar。
  4. 多語系且長度固定(極少見) → nchar。
  5. 長度可能超過 8,000 位元組 / 4,000 字元 → varchar(max) / nvarchar(max)。

效能與儲存建議

  • 索引鍵欄位(PK、FK、JOIN 條件)優先用固定長度 char/nchar 或窄型 varchar/nvarchar,減少索引頁分裂。
  • 大量重複固定代碼值可考慮 char 節省變長儲存開銷(無偏移量陣列)。
  • 資料庫預設排序規則決定 char/varchar 代碼頁,跨庫合併時注意排序規則衝突。
  • sysname 內建型別等同 nvarchar(128) NOT NULL,用於物件名稱欄位。

總結

現代應用**預設使用 nvarchar**,除非明確確認僅處理 ASCII 且對儲存/效能極度敏感才考慮 char/varchar。固定長度型別僅在長度極度穩定且高頻 JOIN/索引場景下具優勢。正確理解「位元組 vs 字元」長度單位差異,避免中文資料截斷 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved