在 SQL Server 中,VARCHAR(20) 和 NVARCHAR(20) 到底有什么区别
|
admin
2026年3月20日 21:51
本文热度 1294
|
用最清楚、最实用的方式告诉你:在 SQL Server 中,VARCHAR(20) 和 NVARCHAR(20) 到底有什么区别、该怎么选、踩坑点在哪里
✅ 1. 本质区别:是否 Unicode(能否存中文)
| | | |
|---|
| VARCHAR(n) | | | 1 字节/字符 |
| NVARCHAR(n) | | | 2 字节/字符 |
✨ 记住一句话:
NVARCHAR 才能保证任何语言不乱码;VARCHAR 受数据库 Collation 限制。
✅ 2. VARCHAR 存中文可能乱码或报错
例如数据库编码是 Latin1 / SQL_Latin1(不支持中文),执行:
INSERT INTO T(Name) VALUES('中文');
如果列类型是:
VARCHAR(20) → 写入时转换失败或变成乱码
✅ 3. 占用空间对比
VARCHAR(20)
- VARCHAR(n) 的 n 是字节,不是字符。能够存多少“字符”取决于编码。
NVARCHAR(20)
NVARCHAR(n) 的 n 是字符数。永远最多存 n 个字符(中英文一样)。
所以,如果你要存大量英文日志、URL、Token、JSON,VARCHAR 更节省空间。
✅ 4. 存储长度(千万别被 NVARCHAR 限制骗了)
⚠ NVARCHAR(20) ≠ 20 字节,而是能装 20 个 Unicode 字符
但 VARCHAR(20) 与 NVARCHAR(20) 功能上的最大差别不是长度,而是 是否支持国际字符。
例如:
| | |
|---|
| | |
| | |
| | |
| | ❌ 注意! SQL Server NVARCHAR 不支持 Emoji(需要 UTF-8) |
🟡 特别说明:
SQL Server NVARCHAR 是 UTF‑16 BMP 区间,不支持 Emoji 等补充字符,存时需要特殊处理(可以存成 NVARCHAR(MAX) + surrogate pair)。
✅ 5. 性能差异(通常可忽略)
但一般业务中差异小到可以忽略不计。
关键是是否需要支持多语言。
✅ 6. 与 Collation 的关系(重点!)
VARCHAR依赖 数据库/表/列的 Collation。
例如:
SQL_Latin1_General_CP1_CI_AS → 不支持中文
所以如果数据库 Collation 是西欧语系,你的 VARCHAR 根本放不了中文。
而:
NVARCHAR永远不受 Collation 的代码页限制,永远能存中文。
✅ 7. 实际开发怎么选?
✔ 建议选择 NVARCHAR 的场景:
✔ 建议选择 VARCHAR 的场景:
🎯 总结(最重要的三句话)
- VARCHAR 依赖 Collation,跨系统容易乱码。
- NVARCHAR(20) 占用 40个字节,可以存储20个字符,不论中英文。
- VARCHAR(20) 存储占用20个单字节,最多可存 20 个单字节字符,比如20个英文字符(在中英文混合模式下具体取决于编码方式)
阅读原文:原文链接
该文章在 2026/3/23 12:03:34 编辑过