将 Varchar 转换为 NVarchar?

Posted

技术标签:

【中文标题】将 Varchar 转换为 NVarchar?【英文标题】:Converting Varchar to NVarchar? 【发布时间】:2011-12-11 21:08:08 【问题描述】:

我知道从nvarchar 转换为varchar 时,一些数据会丢失/更改。

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

【问题讨论】:

【参考方案1】:

nvarchar 存储两倍于 varchar 字符大小的 unicode 字符。因此,只要您的 nvarchar 至少是您的 vchar 长度的两倍,这将不是问题。

如果您没有使用任何超出 ASCII 字符范围的字符(即您没有 Unicode 字符),仍然可以实现其他方式的转换

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


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

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

【讨论】:

所以如果我的列数据类型为varchar(50),这将需要变为nvarchar(100) @Curt:如果您正在谈论使用 SQL 更改长度,那么我认为您应该可以使用相同的长度。这是因为当您指定长度时,您会根据字符数而不是实际存储的数据量来指定长度【参考方案2】:

在大多数情况下,这两种数据类型的方式是相同的 在 SQL Server 中或从应用程序中使用它们。这 不同的是,nvarchar 用于存储 unicode 数据,即 用于在数据库表中存储多语言数据。其他 语言有一组扩展的字符代码,需要 已保存并且此数据类型允许此扩展。如果你的数据库 不会存储多语言数据,您应该使用 varchar 而是数据类型。原因是 nvarchar 需要两倍 varchar 的空间很大,这是因为需要存储 其他语言的扩展字符代码。

(来自:http://weblogs.asp.net/guys/archive/2005/01/15/353550.aspx)

因此,nvarchar 是 varchar 的超集,因此在转换时不应丢失数据。

【讨论】:

【参考方案3】:

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

VARCHAR 存储为常规 8 位数据。但是 NVARCHAR 字符串是 以 UTF-16 存储在数据库中——每个字符 16 位或两个字节, 一直 - 并转换为正在使用的任何代码页 输出上的数据库连接(通常是 UTF-8)。也就是说,NVARCHAR 字符串与它们的 VARCHAR 表兄弟具有相同的长度限制 - 8,000 字节。但是,由于 NVARCHAR 对每个字符使用两个字节 字符,这意味着给定的 NVARCHAR 只能容纳 4,000 个字符 (不是字节)最大值。

【讨论】:

nvarchar(max) 当然可以容纳超过 4,000 个字符 非常正确,但仍然需要考虑例如 Varchar(max) = 2,147,483,645 个字符,而 Nvarchar(max) = 1,073,741,822 个字符。这种情况不太可能发生,但这是从 Varchar 转换为 Nvarchar 时的风险之一

以上是关于将 Varchar 转换为 NVarchar?的主要内容,如果未能解决你的问题,请参考以下文章

nvarchar 值转换为数据类型为 int 发生语法错误

NVARCHAR 和 VARCHAR 转换导致索引扫描

将列从 varchar 转换为 nvarchar 是不是会更改存储在列中的字符串的编码?

SQL里,如何将数据类型nvarchar转换成float?

将浮点数转换为 varchar sql

Sql 2000 中如何把nvarchar 转化为Float?