将 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?的主要内容,如果未能解决你的问题,请参考以下文章