将Varchar转换为NVarchar?

14

在将 nvarchar 转换为 varchar 时,会丢失/更改一些数据。

但是,将 varchar 数据类型转换为 nvarchar 时是否存在数据更改的风险?

3个回答

12

nvarchar 存储 Unicode 字符,其大小是 varchar 字符的两倍。只要您的 nvarchar 至少是您的 vchar 的两倍长度,这不会成为问题。

如果没有使用 ASCII 字符范围之外的字符(即您没有 Unicode 字符),仍然可以实现双向转换。

简而言之,请确保您的 nvarchar 长度是您最大 varchar 值的两倍,然后进行更改。


由于我似乎收到了几个负评(没有解释),所以我想明确一下,当我上面提到长度时,我指的是大小,例如所需存储数据量。请注意我的下面的评论,我也将在此处包含:

如果您正在使用 SQL 更改长度,那么我认为您应该可以具有相同的长度。这是因为当您指定长度时,是基于字符数而不是实际存储的数据量。


4
如果我的列数据类型是varchar(50),那么需要改成nvarchar(100)吗? - Curtis
10
@Curt:如果你想通过使用SQL来改变长度,那么我认为你可以保持相同的长度。这是因为当你指定长度时,是基于字符数而不是实际存储的数据量。 - musefan

2
大多数情况下,这两种数据类型在 SQL Server 中或从应用程序中使用时的工作方式是相同的。区别在于,nvarchar 用于存储 Unicode 数据,用于在数据库表中存储多语言数据。其他语言有一组扩展字符代码需要保存,而此数据类型允许进行此扩展。如果您的数据库不会存储多语言数据,则可以使用 varchar 数据类型。原因是 nvarchar 占用的空间是 varchar 的两倍,这是因为需要存储其他语言的扩展字符代码。

编辑:上述引用摘自 http://weblogs.asp.net/,该源页面已不存在。
有关更多信息,请参阅 MS 文档: varchar:可变长度、非 Unicode 字符数据。数据库排序规则确定使用哪个代码页存储数据。

nvarchar:可变长度的Unicode字符数据。与数据库排序规则有关,用于比较。

nvarchar 可以说是 varchar 的“超集”,在转换时不应该丢失数据。问题更多地涉及ASCII和Unicode之间的区别。


1

从这篇文章http://searchsqlserver.techtarget.com/tip/Differences-between-varchar-and-nvarchar-in-SQL-Server

VARCHAR 存储为常规的 8 位数据。但是 NVARCHAR 字符串以 UTF-16 的形式存储在数据库中,每个字符占用 16 位或两个字节,始终如一,并在输出时转换为数据库连接正在使用的任何代码页(通常是 UTF-8)。也就是说,NVARCHAR 字符串与其 VARCHAR 表亲具有相同的长度限制 - 8000 个字节。然而,由于 NVARCHAR 使用两个字节来表示每个字符,这意味着给定的 NVARCHAR 最多只能容纳 4000 个字符(而不是字节)。


nvarchar(max) 当然可以容纳比 4,000 个字符更多的内容。 - Martin Smith
2
非常正确,但仍需考虑例如Varchar(max)= 2,147,483,645个字符,而Nvarchar(max)= 1,073,741,822个字符。虽然这种情况很少发生,但在从Varchar转换为Nvarchar时存在风险之一。 - Purplegoldfish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接