Skip to content

文章

NVarchar 与 Varchar

2020年8月5日 • 4 分钟阅读

NVarchar 与 Varchar

每个定义新字符串列的工程师都要做出决定:我应该使用 nvarchar 还是 varchar?

自从我发现了 nvarchar,我就一直使用它。我的想法是,为什么要使用一个可能不支持某些文本值的数据类型呢?而且你往往不会发现这种不兼容性,直到它出现在生产环境中。

我听过关于空间的论证,但空间很便宜,不值得担心。我知道你在想什么,当硬盘满了时成本就重要了,我同意这一点。

从 SQL Server 2008 R2 开始,数据压缩被应用于 ncharnvarcharnvarchar(max) 除外)字段。根据数据的不同,压缩的效果也不同,但对于英文,压缩率达到 50%,这使其与 varchar 的空间需求相当(1)。

另一个需要考虑的因素是,大多数编程语言都支持 UTF-16 作为字符串类型。所以每次从数据库加载 varchar 时,它都会被转换为 UTF-16(nvarchar 式)。

这个 StackOverflow 答案总结了 nvarcharvarchar 的区别:

nvarchar 列可以存储任何 Unicode 数据。varchar 列仅限于 8 位代码页。有些人认为应该使用 varchar,因为它占用的空间更少。我认为这不是正确的答案。代码页不兼容性很麻烦,而 Unicode 是解决代码页问题的良药。在如今磁盘和内存便宜的时代,真的没有理由再浪费时间处理代码页问题了。

所有现代操作系统和开发平台在内部都使用 Unicode。通过使用 nvarchar 而不是 varchar,你可以避免每次从数据库读取或写入时进行编码转换。转换需要时间,而且容易出错。从转换错误中恢复是一个非平凡的问题。

如果你要与仅使用 ASCII 的应用程序交互,我仍然建议在数据库中使用 Unicode。操作系统和数据库排序规则算法在使用 Unicode 时会工作得更好。Unicode 避免了与其他系统交互时的转换问题。而且你为未来做好了准备。你仍然可以验证你的数据是否限制在 7 位 ASCII,以满足任何需要维护的遗留系统,同时享受完整 Unicode 存储的一些好处。(2)

我的结论是,数据只有在静止时才是 varchar。

参考资料

1. Unicode 压缩实现
2. varchar 和 nvarchar 之间有什么区别?

作者:Chuck Conway 是一位 AI 工程师,拥有近 30 年的软件工程经验。他构建实用的 AI 系统——内容管道、基础设施代理和解决实际问题的工具——并分享他沿途的学习成果。在社交媒体上与他联系:X (@chuckconway) 或访问他的 YouTubeSubStack

↑ 返回顶部

你可能也喜欢