varchar或nvarchar

时间:2009-08-13 11:09:04

标签: sql sql-server sql-server-2005 variables

我存储名字和姓氏,每个最多30个字符。哪个更好[{1}}或varchar

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

那么我建议您使用:nvarcharnvarchar

另外,请告诉我两者的表现。两者的表现是相同的还是性能不同。因为空间不是太大的问题。问题在于表现。

9 个答案:

答案 0 :(得分:19)

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

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

here之前已在SO上讨论过这个问题。

已编辑:如评论中所述,将ascii更改为ANSI。

答案 1 :(得分:7)

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

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

它还取决于数据库整理。对于例如如果您的数据库排序规则为varchar,则无法在LATIN_CS_AS字段中存储俄语字符。但是,如果您正在使用仅在俄罗斯使用的本地应用程序,则将数据库排序规则设置为俄语。这样做可以让你在varchar字段中输入俄文字符,节省一些空间。

但是,现在,大多数正在开发的应用程序都是国际性的,因此您必须自己决定注册所有用户,并根据该数据类型决定数据类型。

答案 2 :(得分:2)

  

我有红色,nvarchar需要两次varchar。

  

nvarchar用于国际化。

  

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

这取决于应用程序。

答案 3 :(得分:1)

默认使用nvarchar。这些天没有理由选择varchar,并且每个理由都使用nvarchar(允许使用国际字符;如上所述)。

答案 4 :(得分:1)

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

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

我建议你使用nvarchar。

答案 5 :(得分: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。如果你愿意,可以称之为“面向未来”。

答案 6 :(得分:0)

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

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

如果varchar适用于您想要做的事情,您应该使用它。这是一个更少的数据,所以它总体上稍快。如果需要处理各种字符,请使用nvarchar。

答案 7 :(得分:0)

关于表现:
在nvarchar上使用varchar的一个原因是你的索引中可以有两倍的字符!索引键限制为900字节
关于可用性:
如果申请仅供英国观众使用包含英文名称,使用varchar

答案 8 :(得分:0)

要存储的数据:“Sunil”

varchar(5)取7B nvarchar(5)需要12B