每个定义新字符串列的工程师都要做出决定:我应该使用 nvarchar 还是 varchar?
自从我发现了 nvarchar,我就一直使用它。我的想法是,为什么要使用一个可能不支持某些文本值的数据类型呢?而且你往往不会发现这种不兼容性,直到它出现在生产环境中。
我听过关于空间的论证,但空间很便宜,不值得担心。我知道你在想什么,当硬盘满了时成本就重要了,我同意这一点。
从 SQL Server 2008 R2 开始,数据压缩被应用于 nchar 和 nvarchar(nvarchar(max) 除外)字段。根据数据的不同,压缩的效果也不同,但对于英文,压缩率达到 50%,这使其与 varchar 的空间需求相当(1)。
另一个需要考虑的因素是,大多数编程语言都支持 UTF-16 作为字符串类型。所以每次从数据库加载 varchar 时,它都会被转换为 UTF-16(nvarchar 式)。
这个 StackOverflow 答案总结了 nvarchar 与 varchar 的区别:
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) 或访问他的 YouTube 和 SubStack。