写入varchar和nvarchar之间的差异


59

当前在SQL Server 2012数据库中,我们正在使用varchar,并且我们想要更改它nvarchar。我已经生成了一个脚本来做到这一点。

我的问题是,SQL Server在写入varchar列与写入列方面有什么区别nvarchar?我们有许多我关心的后端程序。

编辑:
不确定是否有帮助,但是列没有索引,f / k或约束。


Answers:


46

您需要确保为Unicode字符串文字加上N前缀。例如,如果基础数据类型为NVARCHAR

CREATE TABLE dbo.t(c NVARCHAR(32));

INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';

SELECT c FROM dbo.t;

SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';

结果:

c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!

c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?

c
----
រៀន

对于那些在移动设备或不连续浏览器上显示框字符而不是实际Unicode字符的设备,其外观如下所示:

在此处输入图片说明


37

最大的问题是nvarchar每个字符使用2个字节,而varchar使用1 个字节。因此,nvarchar(4000)使用与varchar(8000)* 相同的存储空间。

除了所有字符数据需要两倍的存储空间外,这还意味着:

  • 您可能必须使用较短的nvarchar列,以使行保持在8060字节行限制/ 8000字节字符列限制之内。
  • 如果您使用的是nvarchar(max)列,它们将比列更快地下推varchar(max)
  • 您可能必须使用较短的nvarchar列才能保持在900字节的索引键限制之内(我不知道您为什么要使用这么大的索引键,但您永远不会知道)。

除此之外nvarchar,假设您的客户端软件是为处理Unicode而构建的,则使用它们并没有太大不同。SQL Server将透明地将a转换varcharnvarchar,因此,除非您在文字中使用2字节(即Unicode)字符,否则您不必严格要求N前缀作为字符串文字。请注意,强制转换nvarchar为会varbinary产生与使用相同的结果varchar。重要的一点是,您不必立即将每个varchar文字更改为nvarchar文字即可保持应用程序正常运行,这有助于简化流程。

*如果使用数据压缩(轻量级行压缩就足够了,SQL Server 2016 SP1之前需要Enterprise Edition ),由于Unicode压缩(使用SCSU算法),您通常会发现ncharnvarchar占用不超过char和的空间。varchar


17

认为以下是主要区别:

  1. Nvarchar存储UNICODE数据。如果您需要存储UNICODE或多语言数据,则选择nvarchar。Varchar存储ASCII数据,应该是正常使用的数据类型。
  2. 关于内存使用情况,nvarchar每个字符使用2个字节,而varchar使用1个字节。
  3. 将VARCHAR连接到NVARCHAR具有相当大的性能损失。
  4. 插入数据时可能需要N前缀:INSERT dbo.t(c)SELECT N'ʥʦ';
  5. 一些专家建议nvarchar始终是因为:由于所有现代操作系统和开发平台都在内部使用Unicode,因此,使用nvarchar而不是varchar可以避免每次读取或写入数据库时​​都进行编码转换。

0

从移动数据库到SQL Server 2005的RDP合并复制需要nvarchar。此外,还大量使用了LTrim(),RTrim()和Trim()。 。

我不知道最近几年是否有变化,但是nvarchar现在是在生成的数据库中使用的VS Pro 2017上.NET简单成员资格网站登录所使用的标准。


-3

如果在Varchar上使用NVarchar,并且不需要支持MULTI-LINQUAL,则会增加数据库,备份(本地和异地)的存储。现代数据库应同时支持这两者,并且在设计中应考虑任何转化匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.