Navicat 博客

SQL Server 中的 Unicode 和非 Unicode 字符串数据类型 2021 年 11 月 19 日,由 Robert Gravelle 撰写

SQL Server 提供了多种数据类型,支持你想要存储的所有数据类型。你可能已经猜到,数据类型是一个属性,用于指定列可以存储数据的类型。它可以是整数、字符串、货币、日期和时间等。在数据库设计人员和开发人员之间引起混淆的一种数据类型是用于存储字符串的数据类型。字符串是作为一组操作的一系列字符。在关系数据库的上下文中,字符串数据类型是那些让你存储固定长度(char)或可变长度数据(varchar)的数据类型。此外,SQL Server 将其字符串类型分为两大类:Unicode 和非 Unicode。Unicode 类型有 nchar、nvarchar 和 ntext,而非 Unicode 类型有 char、varchar/varchar (max) 和 text。在今天的文章中,我们将比较这两个类别,以决定何时使用它们。

追查 Unicode 和非 Unicode 数据类型的起源

Nchar 是“NATIONAL CHARACTER”的缩写,nvarchar 代表“NATIONAL CHARACTER VARYING”,ntext 是“NATIONAL TEXT”的 ISO 同义词。最初用于 Unicode 之前的多字节编码,例如亚洲字符的 JIS 编码。其想法是 VARCHAR 将继续用于 ASCII,而 NVARCHAR 就用于非 ASCII 字符。

这个用例是在互联网还处于起步阶段和 Unicode 项目起飞之前设计的。在那些日子里,特别是亚洲语言,他们使用自己特定且相互不兼容的编码,如中国大陆的 GB、日语的 JIS/SJIS、香港和台湾的 BIG5、台湾的 CNS 等等。然而,随着 Unicode 项目编码的出现,所有这些都改变了,因为数据库供应商意识到只允许 VARCHAR 本身支持多字节字符编码并使用字符集和排序规则来处理特定编码更容易。例如,你可以使用 UTF-8 对应用程序需要支持的任何语言中所需的任何字符进行编码。因此,对特定于“NATIONAL CHARACTER”的整组字符数据类型的需求很快就消失了。

现今,在许多现代数据库引擎中,“NVARCHAR”和“NATIONAL CHARACTER VARYING”实际上只是 VARCHAR 的别名,实际使用几乎(如果不完全)相同。话虽如此,SQL Server 确实以不同的方式对待这两者。如文档中所述:

varchar 和 nvarchar 的主要区别在于它们的存储方式,varchar 存储为常规 8 位数据(每个字符 1 个字节),而 nvarchar 存储每个字符 2 个字节的数据。由于这个原因,nvarchar 最多可以容纳 4000 个字符,它占用的空间是 SQL varchar 的两倍。

应使用哪种?

如上所述,在决定使用哪种类型时,最关心的是所使用的存储量。例如,nvarchar 每个字符使用 2 个字节,而 varchar 使用 1 个字节。因为这样,nvarchar(4000) 使用的存储空间量与 varchar(8000) 相同。因此,如果你有存储 UNICODE 或多语言数据的需求,nvarchar 是最佳选择。而 varchar 存储 ASCII 数据,应该是你正常使用时选择的数据类型。另一个考虑因素是在查询中将 VARCHAR 列联接到 NVARCHAR(反之亦然)可能会导致大幅度的性能下降。

总结

在本文中,我们比较了 SQL Server 的 Unicode 和非 Unicode 字符串数据类型,以决定何时使用它们。

Navicat 文章
频道条目
分享
文章归档