写 varchar 和 nvarchar 之间的区别

Chr*_*s L 65 sql-server varchar

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

我的问题是 SQL Server 写入varchar列的方式与写入列的方式有什么不同吗?nvarchar列的吗?我们有一些我很关心的后端程序。

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

Aar*_*and 51

您需要确保使用 N 前缀作为 Unicode 字符串文字的前缀。例如,如果基础数据类型是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'???';
Run Code Online (Sandbox Code Playgroud)

结果:

c
----
??? -- not stored correctly
??? -- not stored correctly
??? -- stored correctly!

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

c
----
???
Run Code Online (Sandbox Code Playgroud)

对于那些在移动设备或老旧浏览器上显示框字符而不是实际 Unicode 字符的用户,它是这样的:

在此处输入图片说明


db2*_*db2 41

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

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

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

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

* 如果您使用数据压缩(轻量级行压缩就足够了,SQL Server 2016 SP1 之前的企业版需要),由于Unicode 压缩(使用SCSU 算法),您通常会发现nchar并且nvarchar占用的空间不超过charand 。varchar


rch*_*cko 20

认为以下是主要区别:

  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,将避免每次读取或写入数据库时​​进行编码转换


归档时间:

查看次数:

250082 次

最近记录:

7 年,2 月 前