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


当前回答

主要是nvarchar存储Unicode字符,varchar存储非Unicode字符。

“Unicodes”是指16位字符编码方案,允许来自许多其他语言(如阿拉伯语、希伯来语、汉语、日语)的字符在单个字符集中编码。

这意味着unicode使用每个字符2个字节来存储,而非unicode使用每字符一个字节来进行存储。这意味着与非unicode相比,unicode需要双倍的存储容量。

其他回答

我会说,这取决于情况。

如果您开发一个桌面应用程序,其中操作系统以Unicode(与所有当前的Windows系统一样)工作,并且语言本身支持Unicode(默认字符串为Unicode,如Java或C#),那么使用nvarchar。

如果您开发了一个web应用程序,其中字符串以UTF-8形式出现,语言为PHP,而PHP本身仍然不支持Unicode(在5.x版本中),那么varchar可能是一个更好的选择。

我不得不在这里说(我意识到我可能会打开自己的心扉!),但NVARCHAR确实比VARCHAR更有用(注意更多!)的唯一时间是,所有从属系统上的所有排序规则和数据库本身都是相同的。。。?如果没有,那么无论如何都必须进行排序规则转换,因此VARCHAR和NVARCHAR一样可行。

除此之外,一些数据库系统,如SQL Server(2012年之前)的页面大小约为8K。因此,如果您要存储未保存在TEXT或NTEXT字段中的可搜索数据,那么VARCHAR提供了8k的完整空间,而NVARCHAR仅提供4k(双倍字节,双倍空间)。

总之,我想,两者的使用取决于:

项目或上下文基础设施数据库系统

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

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

nArchar将帮助您存储Unicode字符。如果您想存储本地化的数据,这是一种方法。

虽然NVARCHAR存储Unicode,但您应该考虑借助于排序,您也可以使用VARCHAR并保存本地语言的数据。

想象一下下面的场景。

DB的排序规则是波斯语,您可以在VARCHAR(10)数据类型中保存一个类似“علی”(阿里的波斯语书写)的值。没有问题,DBMS只使用三个字节来存储它。

但是,如果要将数据传输到另一个数据库并查看正确的结果,则目标数据库必须与目标数据库具有相同的排序规则,在本例中为波斯语。

如果目标排序规则不同,则会在目标数据库中看到一些问号(?)。

最后,请记住,如果您使用的是用于本地语言的大型数据库,我建议您使用位置,而不是使用太多空间。

我相信设计会有所不同。这取决于你工作的环境。