| 型別 | 長度特性 | 字元集 | 儲存大小 | 適用場景 |
|---|---|---|---|---|
char(n) | 固定長度 1~8,000 | 非 Unicode | n 位元組 | 資料長度幾乎固定(如代碼、MD5、身分證字號) |
varchar(n|max) | 可變長度 1~8,000 / max=2^31-1 | 非 Unicode | 實際資料長度 + 2 位元組 | 長度變化大、可能超過 8,000 位元組 |
nchar(n) | 固定長度 1~4,000 | Unicode (UCS-2) | 2n 位元組 | 多語系、固定長度 Unicode 資料 |
nvarchar(n|max) | 可變長度 1~4,000 / max=2^31-1 | Unicode (UCS-2) | 2 × 實際字元數 + 2 位元組 | 多語系、長度變化大、通用首選 |
n* 型別支援多國語言(中日韓等),儲存大小為字元數 × 2 位元組;char/varchar 依資料庫排序規則代碼頁,跨語系易產生亂碼或資料截斷。char/nchar) 不足補空白,查詢需注意 RTRIM;可變長度 (varchar/nvarchar) 僅佔實際大小,索引統計資訊更準確。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 字完整保留「您啊啊啊啊是」。char/nchar 或窄型 varchar/nvarchar,減少索引頁分裂。char 節省變長儲存開銷(無偏移量陣列)。char/varchar 代碼頁,跨庫合併時注意排序規則衝突。sysname 內建型別等同 nvarchar(128) NOT NULL,用於物件名稱欄位。現代應用**預設使用 nvarchar**,除非明確確認僅處理 ASCII 且對儲存/效能極度敏感才考慮 char/varchar。固定長度型別僅在長度極度穩定且高頻 JOIN/索引場景下具優勢。正確理解「位元組 vs 字元」長度單位差異,避免中文資料截斷 Bug。