回答:
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文字の代わりにボックス文字を表示するモバイルデバイスまたは老朽化したブラウザの場合、次のようになります。
最大の懸念は、nvarchar
1文字あたり2バイトを使用するのに対してvarchar
、1を使用することです。したがって、* nvarchar(4000)
と同じ量のストレージスペースを使用しvarchar(8000)
ます。
2倍のストレージスペースを必要とするすべてのキャラクターデータに加えて、これは次のことも意味します。
nvarchar
行を8060バイトの行制限/ 8000バイトの文字列制限内に保つために、短い列を使用する必要がある場合があります。nvarchar(max)
列を使用している場合、列はすぐに行外にプッシュされvarchar(max)
ます。nvarchar
900バイトのインデックスキーの制限内に収まるように短い列を使用する必要がある場合があります(このような大きなインデックスキーを使用する理由はわかりませんが、わかりません)。それに加えて、nvarchar
クライアントソフトウェアがUnicodeを処理するように構築されていると仮定すると、作業はそれほど変わりません。SQL Serverはa varchar
を透過的にアップコンバートするためnvarchar
、リテラルで2バイト(つまりUnicode)文字を使用している場合を除き、文字列リテラルにNプレフィックスを厳密に必要としません。にキャストnvarchar
するvarbinary
と、で同じ結果を出すのとは異なる結果になることに注意してくださいvarchar
。重要な点は、すべてのvarcharリテラルをnvarcharリテラルにすぐに変更してアプリケーションの動作を維持する必要がないことです。これにより、プロセスが容易になります。
あなたは、データ圧縮を使用する場合*(軽量行圧縮が十分であるが、Enterprise Editionが必要なSQL Serverの2016 SP1の前にあなたが普通でしょう)nchar
とnvarchar
比べて何もより多くのスペースを取りませんchar
し、varchar
原因を、(SCSUアルゴリズムを使用して)Unicodeの圧縮。
主な違いは次のとおりです。