只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?


当前回答

你说得对。nvarchar存储Unicode数据,而varchar存储单字节字符数据。除了您已经提到的存储差异(nvarchar需要两倍于varchar的存储空间)之外,更喜欢nvarchar而不是varchar的主要原因是国际化(即以其他语言存储字符串)。

其他回答

如果使用单个字节存储字符,则有256种可能的组合,因此可以保存256种不同的字符。排序规则是一种模式,它定义了字符及其进行比较和排序的规则。

1252,即拉丁语1(ANSI),是最常见的。单字节字符集也不足以存储许多语言使用的所有字符。例如,一些亚洲语言有数千个字符,因此每个字符必须使用两个字节。

Unicode标准

当在网络中使用使用多个代码页的系统时,管理通信变得困难。为了实现标准化,ISO和Unicode联盟引入了Unicode。Unicode使用两个字节来存储每个字符。也就是说,可以定义65536个不同的字符,所以几乎所有的字符都可以被Unicode覆盖。如果两台计算机使用Unicode,每个符号都将以相同的方式表示,不需要转换-这就是Unicode背后的想法。

SQL Server有两类字符数据类型:

非Unicode(char、varchar和文本)Unicode(nchar、nvarchar和ntext)

如果我们需要保存来自多个国家的字符数据,请始终使用Unicode。

我看了一下答案,许多人似乎建议使用nvarchar而不是varchar,因为空间不再是问题,所以启用Unicode以获得很少的额外存储不会有什么害处。嗯,当你想在列上应用索引时,这并不总是正确的。SQL Server对可以索引的字段的大小限制为900字节。因此,如果您有一个varchar(900),您仍然可以对其进行索引,但不能对varchar(901)进行索引。使用nvarchar,字符数减半,因此可以索引到nvarchar(450)。因此,如果您确信不需要nvarchar,我不建议使用它。

一般来说,在数据库中,我建议您坚持所需的大小,因为您可以随时扩展。例如,一位同事曾经认为,对列使用nvarchar(max)没有害处,因为我们在存储方面完全没有问题。后来,当我们试图对此列应用索引时,SQL Server拒绝了这一点。然而,如果他甚至从varchar(5)开始,我们可以简单地将其扩展到我们需要的内容,而不会出现这样的问题,这将要求我们制定一个字段迁移计划来解决这个问题。

遵循Sql Server VARCHAR和NVARCHAR数据类型之间的差异。在这里,你可以看到一个非常描述性的方式。

一般来说,varchar将数据存储为Unicode,因此,如果要在数据列中存储多语言数据(多种语言),则需要N变量。

由于SQL Server 2019 varchar列支持UTF-8编码。

因此,从现在开始,不同的是规模。

在转换为速度差异的数据库系统中。

更少的数据=更少的IO+更少的内存=通常速度更快。阅读上面的文章了解数字。

从现在开始在UTF8中使用varchar!

只有当您拥有2048-16383和16384-65535范围内的大量字符时,您才需要测量

我总是使用nvarchar,因为它允许我正在构建的任何东西都能承受我扔给它的几乎所有数据。我的CMS系统使用中文是偶然的,因为我使用了nvarchar。现在,任何新的应用程序都不应该真正关注所需的空间量。