varchar和nvarchar有什么区别?

问题描述 投票:1261回答:18

只是nvarchar支持多字节字符吗?如果是这种情况,使用varchars除了存储问题之外还有什么意义吗?

sql-server varchar nvarchar
18个回答
1550
投票

nvarchar列可以存储任何Unicode数据。 varchar列仅限于8位代码页。有些人认为应该使用varchar,因为它占用的空间更少。我相信这不是正确的答案。代码页不兼容性很痛苦,Unicode可以解决代码页问题。现在有了廉价的磁盘和内存,实际上没有理由浪费时间来处理代码页了。

所有现代操作系统和开发平台都在内部使用Unicode。通过使用nvarchar而不是varchar,您可以避免每次读取或写入数据库时​​进行编码转换。转换需要时间,并且容易出错。从转换错误中恢复是一个非常重要的问题。

如果您与仅使用ASCII的应用程序连接,我仍然建议在数据库中使用Unicode。操作系统和数据库整理算法将更好地与Unicode一起使用。 Unicode避免了与其他系统连接时的转换问题。你将为未来做准备。您可以随时验证您的数据是否仅限于7位ASCII,以用于您必须维护的任何遗留系统,即使在享受完整Unicode存储的一些优势的同时也是如此。


6
投票

nVarchar将帮助您存储Unicode字符。如果要存储本地化数据,这是可行的方法。


6
投票

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

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

Unicode standard

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

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

  • 非Unicode(char,varchar和text)
  • Unicode(nchar,nvarchar和ntext)

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


6
投票

虽然NVARCHAR存储了Unicode,但您应该在整理的帮助下考虑使用VARCHAR并保存您当地语言的数据。

想象一下以下场景。

你的数据库的整理是波斯语,你在VARCHAR(10)数据类型中保存了像'علی'(波斯写的阿里)这样的值。没有问题,DBMS只使用三个字节来存储它。

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

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

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

我相信设计可能会有所不同。这取决于您所处理的环境。


5
投票

我不得不在这里说(我意识到我可能会打开自己的一个平板!),但肯定唯一一次NVARCHAR实际上更有用(注意更多!)比VARCHAR是所有的整理所有依赖系统和数据库本身都是一样的......?如果没有,那么无论如何都必须进行整理转换,因此使VARCHARNVARCHAR一样可行。

除此之外,某些数据库系统(例如SQL Server (before 2012))的页面大小约为。 8K。所以,如果你正在寻找存储不像TEXTNTEXT字段那样的可搜索数据,那么VARCHAR提供了全部8k的空间,而NVARCHAR只提供4k(字节的两倍,空间的两倍)。

我想,总而言之,使用任何一种都取决于:

  • 项目或背景
  • 基础设施
  • 数据库系统

5
投票

关注Difference Between Sql Server VARCHAR and NVARCHAR Data Type。在这里你可以用一种非常描述的方式看到。

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


5
投票

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

一般来说,在数据库中,我建议坚持你需要的大小,因为你总是可以扩展。例如,一位工作的同事曾经认为将nvarchar(max)用于色谱柱没有任何害处,因为我们对储存没有任何问题。稍后,当我们尝试在此列上应用索引时,SQL Server拒绝了此操作。然而,如果他开始使用varchar(5),我们可以简单地将其扩展到我们需要的东西,而不会出现需要我们执行现场迁移计划来解决此问题的问题。


4
投票

Varchar(n)nvarchar(n)的主要区别是:enter image description here

Varchar(可变长度,非Unicode字符数据)大小高达8000. 1.它是一个可变长度数据类型

  1. 用于存储非Unicode字符
  2. 每个字符占用1个字节的空间

enter image description here

Nvarchar:可变长度的Unicode字符数据。

1.它是一种可变长度的数据类型

2.用于存储Unicode字符。

  1. 数据以Unicode编码存储。支持每种语言。 (例如阿拉伯语,德语,印地语等语言等)

1
投票

Jeffrey L Whitledge拥有约47000的声望评分,建议使用nvarchar

Solomon Rutzky的声望得分约为33200,建议:不要总是使用NVARCHAR。这是一种非常危险且往往代价高昂的态度/态度。

What are the main performance differences between varchar and nvarchar SQL Server data types?

https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4

这两个人如此高的声誉,学习SQL Server数据库的开发人员选择了什么?

如果您的选择不一致,那么在有关性能问题的答案和评论中会有很多警告。

有评论pro / con nvarchar的性能。

有关于性能的评论pro / con varchar。

我有一个特殊要求,有一个包含数百列的表,这本身可能不常见?

我选择varchar以避免接近SQL * server 2012的8060字节表记录大小限制。

对我来说,使用nvarchar超过了这个8060字节的限制。

我也在想我应该将相关代码表的数据类型与主中心表的数据类型相匹配。

我见过在澳大利亚南部政府这个工作地点使用varchar色谱柱,以前经验丰富的数据库开发人员,表行数将达数百万或更多(而且这些非常大的nvarchar列很少,如果有的话)表),所以预期的数据行可能成为这个决定的一部分。


0
投票

nvarchar相比,使用varchar是安全的,以使我们的代码没有错误(类型不匹配),因为nvarchar也允许unicode字符。当我们在SQL Server查询中使用where条件时,如果我们使用=运算符,它会抛出一些错误。可能的原因是我们的映射列将在varchar中有所不同。如果我们在nvarchar中定义它,这个问题我就不会发生。仍然我们坚持varchar并避免这个问题我们更好地使用LIKE关键词而不是=


239
投票

varchar:可变长度,非Unicode字符数据。数据库排序规则确定使用哪个代码页存储数据。

nvarchar:可变长度的Unicode字符数据。取决于数据库排序规则进行比较。

有了这些知识,请使用与输入数据匹配的任何一种(ASCII v.Unicode)。


64
投票

我总是使用nvarchar,因为它允许我正在构建的任何数据,以承受我投入的任何数据。我的CMS系统偶然会中文,因为我使用的是nvarchar。如今,任何新应用程序都不应该真正关注所需的空间量。


28
投票

这取决于Oracle的安装方式。在安装过程中,将设置NLS_CHARACTERSET选项。您可以使用查询SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'找到它。

如果你的NLS_CHARACTERSET是像UTF8这样的Unicode编码,那很好。使用VARCHAR和NVARCHAR几乎完全相同。现在停止阅读,就去吧。否则,或者如果您无法控制Oracle字符集,请继续阅读。

VARCHAR - 数据存储在NLS_CHARACTERSET编码中。如果同一服务器上有其他数据库实例,则可能受其限制;反之亦然,因为你必须分享设置。这样的字段可以存储可以使用该字符集编码的任何数据,而不存储其他任何数据。因此,例如,如果字符集是MS-1252,则只能存储英文字母,少数重音字母和其他一些字符(如€和 - )。您的应用程序仅对少数区域设置有用,无法在世界其他任何地方运行。出于这个原因,它被认为是一个坏主意。

NVARCHAR - 数据以Unicode编码存储。支持每种语言。一个好主意。

存储空间怎么样? VARCHAR通常是高效的,因为字符集/编码是为特定区域设置定制的。 NVARCHAR字段以UTF-8或UTF-16编码存储,基于NLS设置具有讽刺意味。 UTF-8对于“西方”语言非常有效,同时仍然支持亚洲语言。 UTF-16对亚洲语言非常有效,同时仍然支持“西方”语言。如果担心存储空间,请选择NLS设置以使Oracle根据需要使用UTF-8或UTF-16。

处理速度怎么样?大多数新的编码平台本身都使用Unicode(Java,.NET,甚至多年前的C ++ std :: wstring!),所以如果数据库字段是VARCHAR,它会强制Oracle在每次读取或写入时在字符集之间进行转换,这样做不太好。使用NVARCHAR可以避免转换。

底线:使用NVARCHAR!它避免了限制和依赖性,适用于存储空间,通常也是性能最佳的。


17
投票

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


14
投票

我的两分钱

  1. 不使用正确的数据类型时,索引可能会失败: 在SQL Server中:当您在VARCHAR列上有索引并为其提供Unicode字符串时,SQL Server不会使用该索引。当您将BigInt呈现给包含SmallInt的索引列时,会发生同样的情况。即使BigInt小到可以成为SmallInt,SQL Server也无法使用索引。另一种方法是没有这个问题(当将SmallInt或Ansi-Code提供给索引的BigInt ot NVARCHAR列时)。
  2. 数据类型可能因不同的DBMS(数据库管理系统)而异: 知道每个数据库的数据类型略有不同,VARCHAR并不代表所有数据类型。虽然SQL Server具有VARCHAR和NVARCHAR,但Apache / Derby数据库仅具有VARCHAR,而VARCHAR具有Unicode。

12
投票

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

“Unicodes”是指16位字符编码方案,允许将来自阿拉伯语,希伯来语,中文,日语等许多其他语言的字符编码为单个字符集。

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


9
投票

你是对的。 nvarchar存储Unicode数据,而varchar存储单字节字符数据。除了存储差异(nvarchar需要两倍于varchar的存储空间),你已经提到过,nvarchar优于varchar的主要原因是国际化(即用其他语言存储字符串)。


9
投票

我会说,这取决于。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.