varchar 或 nvarchar

13

我正在存储名字和姓氏,每个字段最多30个字符。哪种更好:varchar 还是 nvarchar

我了解到,nvarchar 占用的空间是 varchar 的两倍,并且 nvarchar 用于国际化。

所以你建议我使用什么: nvarchar 还是 varchar

此外,请告诉我它们的性能如何。它们的性能相同还是不同?因为空间不是太大的问题,问题在于性能。


1
https://dev59.com/9XVD5IYBdhLWcg3wQZUg - Sam Saffron
9个回答

19

nvarchar基本上表示您可以处理许多字母表,而不仅仅是普通英语。从技术上讲,它意味着支持Unicode,而不仅仅是ANSI。这意味着双字节字符或大约两倍的空间。如今,磁盘空间非常便宜,您最好从一开始就使用nvarchar,而不是在产品寿命周期中进行更改。

如果您确定只需要支持一种语言,则可以使用varchar,否则我建议使用nvarchar。

此前在Stack Overflow上已经讨论过此问题here

编辑:根据评论更改为ANSI,而不是ASCII。


3
苛刻一点:实际上,VARCHAR 存储 ANSI 数据 - 8 位,通常基于诸如西欧或冰岛等代码页。它是 ANSI - 8 位,而不是 ASCII(= 7 位)。 - marc_s

7
首先需要澄清的是,nvarchar 存储 Unicode 数据,而 varchar 存储 ANSI(8 位)数据。它们的功能相同,但 nvarchar 占用的空间是 varchar 的两倍。
通常情况下,我更喜欢使用 varchar 数据类型来存储用户名,除非这些名称包含超出 varchar 可以存储的字符范围之外的字符。
这也取决于数据库排序规则。例如,如果您的数据库排序规则为 LATIN_CS_AS,则无法在 varchar 字段中存储俄语字符。但是,如果您正在开发仅在俄罗斯使用的本地应用程序,则应将数据库排序规则设置为俄语。这样做可以允许您在 varchar 字段中输入俄语字符,从而节省一些空间。
但是,现在大多数正在开发的应用程序都是国际化的,因此您必须自己决定哪些用户将注册,并根据此确定数据类型。

2

我读到过nvarchar比varchar要多占用两倍的空间。

是的。

nvarchar用于国际化。

是的。

你建议我使用nvarchar还是varchar?

这取决于具体应用。


1
不正确。nvarchar 需要的空间是 varchar 的两倍。您可以使用 DATALENGTH 函数轻松检查此内容。 - Guffa
谢谢Kirtan。我为造成的不便道歉。 - KV Prajapati

1

默认情况下使用nvarchar。现在很少有理由使用varchar,而使用nvarchar则有充分的理由(允许使用国际字符;如前所述)。


1

varchar 每个字符占用 1 字节,nvarchar 每个字符占用 2 字节。

nvarchar 使用的空间更多,但允许使用的字符更多。额外的空间可以忽略不计,但您将来可能会需要这些额外的字符。即使您不希望进行国际化,人们的姓名中通常也会包含非英语字符(例如 é、ñ 或 ö)。

我建议您使用 nvarchar。


1
我看到过 nvarchar 占用的空间是 varchar 的两倍。
是的。根据微软的说法:“存储大小(以字节为单位)是输入字符数的两倍加上 2 个字节”(http://msdn.microsoft.com/en-us/library/ms186939(SQL.90).aspx)。
但是存储空间很便宜,我从不担心多出几个字节。
此外,为了避免未来的麻烦,请将最大宽度设置得更大一些,比如 100 个字符。当您使用 varchar 或 nvarchar 时,这样做绝对不会增加存储开销(与 char/nchar 相反)。您永远不知道何时会遇到一个三重姓或某个超过 30 个字符的长外国名字。
nvarchar 用于国际化。

nvarchar 可以存储任何 Unicode 字符,例如来自非拉丁脚本(阿拉伯语、中文等)的字符。我不确定您的应用程序将如何获取数据(通过 Web、GUI 工具包等),但您使用的任何技术都可能支持 Unicode。这意味着对于任何用户输入的数据(例如名称),现在或将来 始终 存在接收非拉丁字符的可能性。

如果我正在构建一个新应用程序,我会使用 nvarchar。如果您愿意,可以称其为“未来证明”。


0

需要存储的数据:"Sunil"

varchar(5) 占用 7B nvarchar(5) 占用 12B


0

nvarchar 类型是 Unicode 编码,可以处理地球上任何语言中存在的字符。这些字符以 UTF-16 或 UCS-2 编码存储(不确定是哪种,差别微小),所以每个字符使用两个字节。

varchar 类型使用 8 位字符集,因此受限于您为字段选择的字符集中的 255 个字符。有不同的字符集可以处理不同的字符组,因此通常对于本地文本来说足够了。

如果 varchar 可以完成您想要做的工作,则应使用它。它需要更少的数据,因此总体上略微更快。如果您需要处理各种字符,请使用 nvarchar。


0

关于性能:
使用varchar而不是nvarchar的原因之一是你可以在索引中拥有两倍的字符!索引键限制为900个字节
关于可用性:
如果应用程序只面向英语受众并包含英语名称,请使用varchar


从未遇到过长度超过450个字符的索引。 - zszep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接