SQL 中四种字符类型的区别
你提到的这四种类型确实是最基础的字符存储类型,但它们之间有一个核心区别:是否支持 Unicode(多语言) 和 是否固定长度。
下面我直接用一个表格让你看清楚,然后分别解释。
一、总览对比表
类型 | 支持语言 | 长度方式 | 每个字符占用字节 | 适用场景 |
char | 非 Unicode(英文/中文系统默认编码) | 固定 | 1 字节 (ASCII) 或 2 字节 (GBK/中文) | 长度固定、不含中文(如手机号、身份证号) |
varchar | 非 Unicode | 可变 | 同上 | 长度不固定、不含中文(如英文文章、昵称) |
nchar | Unicode(任何语言) | 固定 | 2 字节(固定) | 多语言环境、长度固定(如代码、GUID) |
nvarchar | Unicode(任何语言) | 可变 | 2 字节(固定) | 多语言、长度不固定(如用户评论、地址) |
二、分别解释
1. char(n) —— 固定长度非 Unicode
n代表字符数量无论实际存多少,永远占满 n 个字符的空间
不专门支持 Unicode(依赖数据库排序规则)
示例:
sql
DECLARE @c CHAR(10)SET @c = 'abc' -- 实际占用10个字符位
👉 适合:手机号、身份证号、固定代码
2. varchar(n) —— 可变长度非 Unicode
只占用实际长度 + 1~2 字节额外开销
不专门支持 Unicode
比
char节省空间
示例:
sql
DECLARE @v VARCHAR(10)SET @v = 'abc' -- 只占用 3 个字符 + 2 字节
👉 适合:英文文章、昵称、描述
3. nchar(n) —— 固定长度 Unicode
每个字符固定占 2 字节
支持任何语言(中文、英文、日文、韩文、特殊符号)
长度固定
示例:
sql
DECLARE @nc NCHAR(10)SET @nc = '你好' -- 仍然占10个字符位(每个字符2字节)
👉 适合:多语言固定长度数据、GUID
4. nvarchar(n) —— 可变长度 Unicode
每个字符固定占 2 字节
只占用实际长度 + 额外开销
支持所有语言
示例:
sql
DECLARE @nv NVARCHAR(100)SET @nv = '你好' -- 只占 2 个字符 + 2 字节
👉 适合:用户输入、评论、地址、产品名(任何可能有中文或特殊符号的地方)
三、一个重要问题:什么是“支持 Unicode”?
不带
n(char / varchar):
只能存数据库当前默认编码的语言(比如英文或中文,但不能同时存在)带
n(nchar / nvarchar):
可以同时存中文、日文、韩文、英文、特殊符号 ✅
举例:
sql
-- ✅ 正常DECLARE @nv NVARCHAR(50) = '你好,世界 Hello 🌍'-- ⚠️ 可能乱码DECLARE @v VARCHAR(50) = '你好,世界 Hello 🌍'
四、你在事务变量里应该怎么选?
| 如果变量中可能包含... | 推荐类型 |
|---|---|
| 仅英文/数字(不含中文) | varchar ✅ |
| 中文或任何多语言 | nvarchar ✅ |
| 长度固定(如身份证) | char / nchar |
| 长度不固定 | varchar / nvarchar |
👉 现在绝大多数应用都推荐用 nvarchar,避免乱码问题。
五、存储空间对比(实际很重要)
| 存“你好” | 占用空间 |
|---|---|
char(10) | 20 字节 |
varchar(10) | 6 字节(2字符+2字节) |
nchar(10) | 20 字节 |
nvarchar(10) | 6 字节 |
👉 可变长度(var)通常在真实业务中更节约空间。
六、一句话记忆口诀
不带 n 是本地语,带 n 是全球通;
char 固定占满位,var 变长更省空。