varcharとnvarcharの違いを記述する


59

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

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

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


回答:


46

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文字の代わりにボックス文字を表示するモバイルデバイスまたは老朽化したブラウザの場合、次のようになります。

ここに画像の説明を入力してください


37

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

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

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

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

あなたは、データ圧縮を使用する場合*(軽量行圧縮が十分であるが、Enterprise Editionが必要なSQL Serverの2016 SP1の前にあなたが普通でしょう)ncharnvarchar比べて何もより多くのスペースを取りませんcharし、varchar原因を、(SCSUアルゴリズムを使用して)Unicodeの圧縮


17

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

  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を常に推奨しています。最新のオペレーティングシステムと開発プラットフォームはすべてvarcharではなくnvarcharを使用して内部的にUnicodeを使用するため、データベースの読み取りまたは書き込みのたびにエンコード変換を回避するためです。

0

nvarcharは、モバイルDBからSQL Server 2005へのRDPマージレプリケーションに必要でした。また、LTrim()、RTrim()、Trim()が多く使用されました。bcnvarcharは、データ入力からスペースを自動的にtrim()しませんでしたが、Varcharは。

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


-3

VarcharではなくNVarcharを使用し、MULTI-LINQUALをサポートする必要がない場合、DB、バックアップ(ローカルおよびオフサイト)のストレージを増やします。最新のデータベースは両方をサポートする必要があり、設計では変換ヒットを考慮する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.