web-dev-qa-db-ja.com

varcharとnvarcharの違いを書く

現在、SQL Server 2012データベースではvarcharを使用していますが、nvarcharを変更します。そのためのスクリプトを生成しました。

SQL Serverがvarchar列とnvarchar列に書き込む方法に違いはありますか?私が心配しているバックエンド手順がいくつかあります。

編集:
これが役立つかどうかはわかりませんが、列にはインデックス、f/k、またはそれらに対する制約がありません。

65
Chris L

Unicode文字列リテラルの前には必ずNプレフィックスを付ける必要があります。たとえば、基になるデータタイプが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'រៀន';

結果:

c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!

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

c
----
រៀន

実際のUnicode文字ではなくボックス文字を表示するモバイルデバイスまたは老朽化したブラウザーのユーザーの場合、次のようになります。

enter image description here

51
Aaron Bertrand

最大の懸念は、nvarcharが文字あたり2バイトを使用するのに対し、varcharは1バイトを使用することです。したがって、nvarchar(4000)varchar(8000) *と同じ量のストレージ領域を使用します。

2倍のストレージ容量を必要とするすべてのキャラクターデータに加えて、これは次のことも意味します。

  • 行を8060バイトの行制限/ 8000バイトの文字列制限内に維持するには、短いnvarchar列を使用する必要がある場合があります。
  • nvarchar(max)列を使用している場合、varchar(max)よりも早く列外にプッシュされます。
  • 900バイトのインデックスキー制限内に収めるには、短いnvarchar列を使用する必要がある場合があります(このような大きなインデックスキーを使用する理由はわかりませんが、わかりません)。

その上、クライアントソフトウェアがUnicodeを処理するように構築されていると仮定すると、nvarcharの操作はそれほど変わりません。 SQL Serverはvarcharnvarcharに透過的にアップコンバートするため、リテラルで2バイト文字(つまりUnicode)を使用している場合を除き、文字列リテラルにNプレフィックスを厳密に必要としません。 nvarcharvarbinaryにキャストすると、varcharで同じことを行う場合とは異なる結果になることに注意してください。重要な点は、アプリケーションを動作させ続けるために、すべてのvarcharリテラルをすぐにnvarcharリテラルに変更する必要がないことです。これにより、プロセスが簡単になります。

*データ圧縮を使用する場合(軽量の行圧縮で十分で、Enterprise Editionが必要SQL Server 2016 SP1より前)通常、ncharnvarcharには nicode圧縮(SCSUアルゴリズムを使用) のため、charおよびvarcharよりも多くのスペース。

41
db2

主な違いは次のとおりです。

  1. NvarcharはUNICODEデータを格納します。 UNICODEまたは多言語データを格納する必要がある場合は、nvarcharが最適です。 VarcharはASCIIデータを格納し、通常の使用にはデータ型として選択する必要があります。
  2. メモリ使用量に関して、nvarcharは1文字あたり2バイトを使用しますが、varcharは1を使用します。
  3. VARCHARをNVARCHARに結合すると、パフォーマンスに大きな影響があります。
  4. データを挿入するときにNプレフィックスが必要になる場合があります。INSERT dbo.t(c)SELECTN'ʤʥʦʧʨ ';
  5. 一部の専門家は常にnvarcharを推奨しています。すべての最新のオペレーティングシステムと開発プラットフォームは内部でUnicodeを使用しているため、varcharではなくnvarcharを使用すると、データベースの読み取りまたは書き込みのたびにエンコード変換が回避されます。
20
rchacko

nvarcharは、モバイルDBからSQL Server 2005へのRDPマージレプリケーションに必要でした。また、LTrim()、RTrim()、およびTrim()が頻繁に使用されました。 。

近年変更されたかどうかはわかりませんが、nvarcharは、生成されたデータベースで使用されるVS Pro 2017での.NET Simple Membership Webサイトログインに使用される標準になりました。

0
Joseph Poirier