web-dev-qa-db-ja.com

VarcharをNVarcharに変換しますか?

nvarcharからvarcharに変換すると、一部のデータが失われたり変更されたりすることはわかっています。

ただし、varcharデータ型をnvarcharに変換するときに、データが変更されるリスクはありますか?

13
Curt

nvarcharは、varchar文字の2倍のサイズのUnicode文字を格納します。 nvarcharがvcharの少なくとも2倍の長さである限り、これは問題にはなりません。

ASCII文字範囲外の文字を使用していない(つまり、Unicode文字がない)場合は、他の方法で変換することもできます。

つまり、nvarcharの長さが最大のvarchar値の2倍のサイズであることを確認してから、変更を加えます。


私はこれについて(説明なしで)いくつかの反対票を受け取ったようですので、上記の長さを指すときはサイズを意味することを明確にしたいと思います。その量のストレージデータが必要です。以下の私のコメントに注意してください。これもここに含めます。

SQLで長さを変更することについて話している場合は、同じ長さでも大丈夫だと思います。これは、長さを指定する場合、実際に格納されるデータの量ではなく、文字数に基づいて指定するためです。

6
musefan

ほとんどの場合、2つのデータ型は、SQLServer内またはアプリケーションからの操作方法が同じです。違いは、nvarcharは、データベーステーブルに多言語データを格納するために使用されるUnicodeデータを格納するために使用されることです。他の言語には、保存する必要のある文字コードの拡張セットがあり、このデータ型ではこの拡張が可能です。データベースに多言語データが格納されない場合は、代わりにvarcharデータ型を使用する必要があります。これは、nvarcharがvarcharの2倍のスペースを必要とするためです。これは、他の言語の拡張文字コードを格納する必要があるためです。

(from: http://weblogs.asp.net/guys/archive/2005/01/15/353550.aspx

したがって、nvarcharはvarcharのスーパーセットであるため、変換時にデータが失われることはありません。

3
TheBoyan

この記事から http://searchsqlserver.techtarget.com/tip/Differences-between-varchar-and-nvarchar-in-SQL-Server

VARCHARは通常の8ビットデータとして保存されます。ただし、NVARCHAR文字列はUTF-16(1文字あたり常に16ビットまたは2バイト)としてデータベースに格納され、出力時にデータベース接続で使用されているコードページ(通常はUTF-8)に変換されます。とは言うものの、NVARCHAR文字列には、VARCHARのいとこと同じ長さ制限(8,000バイト)があります。ただし、NVARCHARは各文字に2バイトを使用するため、特定のNVARCHARは最大4,000文字(バイトではない)しか保持できません。

1
Purplegoldfish