2009-08-13 87 views
11

我正在存储名称和姓氏,每个名称最多30个字符。哪一个更好varcharnvarcharvarchar或nvarchar

我读过nvarchar占用的空间是varchar的两倍,而nvarchar用于国际化。

那么你应该使用什么建议:nvarcharvarchar

也请让我知道两者的表现。两者的性能是相同还是性能不同。因为空间不是太大的问题。问题是表现。

+1

http://stackoverflow.com/questions/35366/varchar-vs-nvarchar-performance – 2009-08-13 11:51:00

回答

17

基本上,nvarchar意味着你可以处理大量的字母,而不仅仅是普通的英语。从技术上讲,它意味着unicode支持,而不仅仅是ANSI。这意味着双倍宽度的字符或大约两倍的空间。现在,磁盘空间非常便宜,您不妨从一开始就使用nvarchar,而不是经历在产品生命周期中不得不改变的痛苦。

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

这已在here之前的SO上讨论过。

EDITED:将ascii更改为ANSI,如注释中所述。

+3

是nitpicky:实际上,VARCHAR存储ANSI数据 - 8位,通常基于代码页,如西欧或冰岛或任何你需要的:-)它是ANSI - 8位 - 不是ASCII码(= 7位) – 2009-08-13 11:41:09

6

首先,为了澄清,nvarchar存储unicode数据,而varchar存储ANSI(8位)数据。它们的功能相同,但nvarchar占用了两倍的空间。

通常,我更喜欢使用varchar数据类型来存储用户名称,除非这些名称的字符超出了varchar可存储的字符边界。

它也依赖于数据库排序规则。对于例如如果数据库排序规则为LATIN_CS_AS,则无法将俄语字符存储在varchar字段中。但是,如果您正在使用仅用于俄罗斯的本地应用程序,则会将数据库归类设置为俄语。这将做的是,它将允许您在varchar字段中输入俄语字符,节省一些空间。

但是,现在大部分正在开发的应用程序都是国际化的,因此您必须决定哪些用户将注册,并根据这些决定数据类型。

2

我有红色的nvarchar需要两次作为varchar。

是的。

nvarchar用于国际化。

是的。

你建议我应该使用nvarchar还是varchar?

这取决于应用程序。

+1

不正确。一个nvarchar需要两倍于varchar的空间。您可以使用DATALENGTH函数轻松检查这一点。 – Guffa 2009-08-13 11:18:08

+0

谢谢Kirtan。对由此造成的不便,我深表歉意。 – adatapost 2009-08-13 11:29:37

1

默认情况下使用nvarchar。现在几乎没有什么理由去使用varchar,并且每种理由都需要使用nvarchar(允许使用国际字符;正如讨论的那样)。

1

varchar是每个字符1个字节,nvarchar是每个字符2个字节。

您将在nvarchar中使用更多空间,但还有更多允许的字符。额外的空间可以忽略不计,但你可能会错过未来的额外人物。即使您不希望国际化,人们的名字中通常会有非英文字符(例如é,ñ或ö)。

我建议你使用nvarchar。

0

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

varchar类型使用8位字符集,因此它被限制为您为字段选择的字符集的255个字符。有不同的字符集可处理不同的字符组,因此通常足够用于某个国家或地区的本地文本。

如果varchar适用于你想要做的事情,你应该使用它。它的数据少一点,所以整体上稍微快一点。如果您需要处理各种字符,请使用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字符,例如来自非拉丁脚本(阿拉伯文,中文等)的字符。我不确定你的应用程序将如何获取数据(通过网页,通过GUI工具包等),但很可能您使用的任何技术都支持unicode开箱即用。这意味着对于任何用户输入的数据(例如名称),总是有接收非拉丁字符的可能性,如果不是现在,那么在将来。

如果我正在构建一个新的应用程序,我会使用nvarchar。如果你喜欢,称它为“面向未来的”。

0

性能:
一个理由使用VARCHAR超过nvarchar的是,你可以在你的指标的两倍多字符!索引键被限制为900个字节
可用性:
应用程序是否永远只能用于一个英语观众&包含英文名称,使用VARCHAR

+0

从不遇到超过450个字符长度的索引。 – zszep 2011-03-26 07:44:51

0

数据存储:“苏尼尔”

VARCHAR (5)需要7B nvarchar(5)需要12B