質問

nvarchar の意味

SQL Serverの char nchar varchar 、および nvarchar の違いは何ですか?

役に立ちましたか?

解決

片付ける...またはまとめる...

  • nchar および nvarchar は、 Unicode 文字を保存できます。
  • char および varchar Unicodeを保存できません文字。
  • char および nchar 固定長で、指定した文字数分のストレージスペースを予約します。すべてのスペースを使い切っていない場合でも。
  • varchar および nvarchar 可変長であり、使い果たすだけです格納する文字のスペース。 char nchar などのストレージを予約しません。

nchar nvarchar は2倍のストレージ容量を占有するため、 Unicode サポートが必要な場合にのみ使用するのが賢明です。

他のヒント

これまでのすべての回答は、 varchar がシングルバイト、 nvarchar がダブルバイトであることを示しています。この最初の部分は、実際に照合に依存します(以下を参照)。

DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE  Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)

INSERT INTO @T 
    VALUES (N'中华人民共和国',N'中华人民共和国'),
           (N'abc',N'abc');

SELECT C1,
       C2,
       LEN(C1)        AS [LEN(C1)],
       DATALENGTH(C1) AS [DATALENGTH(C1)],
       LEN(C2)        AS [LEN(C2)],
       DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM   @T  

返品

ここに画像の説明を入力

华 および国 の文字は、 VARCHAR バージョンではまだ表示されず、静かに置き換えられていることに注意してください

実際には、その照合では1バイトで表現できる中国語の文字はまだありません。単一のバイト文字は、典型的なウエスタンASCIIセットのみです。

このため、 nvarchar(X)列から varchar(X)列への挿入が可能です切り捨てエラーで失敗する(ここでXは両方のインスタンスで同じ番号を示します。

SQL Server 2012は、 UTF-16 をサポートするSC(補助文字)照合を追加します。これらの照合では、単一の nvarchar 文字は2または4バイトかかる場合があります。

ncharとcharは、nvarcharとvarcharが行うように、まったく同じように動作します。両者の唯一の違いは、nchar / nvarcharはUnicode文字を格納することです(拡張文字セットの使用が必要な場合は必須)が、varcharは格納しません。

Unicode文字はより多くのストレージを必要とするため、nchar / nvarcharフィールドは2倍のスペースを占有します(たとえば、以前のバージョンのSQL Serverでは、nvarcharフィールドの最大サイズは4000です)。

この質問は、これの複製です。

さらに何かを追加します。 nchar -末尾のスペースをデータに追加します。 nvarchar -データに末尾のスペースを追加しません。

したがって、「nchar」フィールドでデータセットをフィルタリングする場合は、RTRIMを使用してスペースを削除することができます。 例えば。 BRANDというnchar(10)フィールドには、NIKEという単語が格納されます。 単語の右側に6つのスペースを追加します。 したがって、フィルタリングする場合、式は次のようになります。 RTRIM(Fields!BRAND.Value)=" NIKE"

これが誰かの助けになることを願っています。私がほんの少し苦労していたからです!

既存の回答を要約して修正しようとする私の試み:

まず、 char nchar は、保存される文字列が利用可能なスペースよりも小さい場合でも、常に一定量のストレージスペースを使用しますが、 varchar および nvarchar は、その文字列を格納するために必要なストレージスペース(さらに、おそらく文字列の長さを格納するための2バイトのオーバーヘッド)のみを使用します。覚えておいて、" var"変数スペースのように、「変数」を意味します。

2番目に理解すべき重要な点は、 nchar nvarchar は文字ごとに2バイトを使用して文字列を保存するのに対し、 char および varchar は、照合コードページによって決定されるエンコードを使用します。これは、通常、文字ごとに正確に1バイトになります(例外はありますが、以下を参照)。文字ごとに2バイトを使用することで、非常に幅広い文字を保存できるため、ここで覚えておくべき基本的なことは、 nchar nvarchar の方がはるかに良い選択であるということです。国際化サポートが必要な場合、おそらくそれを行います。

いくつかの細かい点について説明します。

まず、 nchar 列と nvarchar 列は、UCS-2を使用して常にデータを保存します。つまり、文字ごとに正確に2バイトが使用され、Basic Multilingual Plane(BMP)のUnicode文字は nchar または nvarchar フィールドで保存できます。ただし、任意の Unicode文字を保存できるわけではありません。たとえば、Wikipediaによると、エジプトの象形文字のコードポイントはBMPの範囲外です。したがって、UTF-8で表現できるUnicode文字列や、SQL Serverの nchar または nvarchar フィールドに格納できない他の真のUnicodeエンコード、および書き込まれた文字列があります。エジプトの象形文字にはそれらが含まれます。幸いなことに、ユーザーはおそらくそのスクリプトを記述しませんが、覚えておく必要があります!

他のポスターが強調しているもう1つの紛らわしいが興味深い点は、照合コードページで必要な場合、 char および varchar フィールドが特定の文字に対して文字ごとに2バイトを使用する場合があることです。 (Martin Smithは、Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WSがこの動作をどのように示すかを示す優れた例を示しています。チェックしてください。)

更新: SQL Server 2012現在、最終的にコードがありますUTF-16のページ。たとえば、Latin1_General_100_CI_AS_SCなど、Unicodeの範囲全体を完全にカバーできます。

  • char :最大8000文字の固定長文字データ。
  • nchar :最大長が4000文字の固定長Unicodeデータ。
  • Char = 8ビット長
  • NChar = 16ビット長

nchar [(n)] (国別文字)

  • 固定長の Unicode 文字列データ。
  • n は文字列の長さを定義し、1〜4,000の値でなければなりません。
  • ストレージサイズは n バイトの2倍です。

nvarchar [(n | max)] (国別文字)

  • 可変長 Unicode 文字列データ。
  • n は文字列の長さを定義し、1〜4,000の値を指定できます。
  • max は、最大ストレージサイズが2 ^ 31-1バイト(2 GB)であることを示します。
  • ストレージサイズ(バイト単位)は、入力されたデータの実際の長さの2倍+ 2バイトです

char [(n)] (文字)

  • 固定長、非Unicode 文字列データ。
  • n は文字列の長さを定義し、1〜8,000の値でなければなりません。
  • ストレージサイズは n バイトです。

varchar [(n | max)] (可変文字)

  • 可変長、非ユニコード文字列データ。
  • n は文字列の長さを定義し、1〜8,000の値を指定できます。
  • max は、最大ストレージサイズが2 ^ 31-1バイト(2 GB)であることを示します。
  • ストレージサイズは、入力されたデータの実際の長さ+ 2バイトです。

違いは次のとおりです。

  1. n [var] charはunicodeを格納しますが、[var] charはシングルバイト文字のみを格納します。
  2. [n] charは正確な長さの固定数の文字を必要としますが、[n] varcharは定義された長さまでの可変数の文字を受け入れます。

もう1つの違いは長さです。 ncharとnvarcharの両方の長さは最大4,000文字です。また、charおよびvarcharの長さは最大8000文字です。ただし、SQL Serverでは、最大2,147,483,648文字を処理できる[n] varchar(max)を使用することもできます。 (2ギガバイト、符号付き4バイト整数。)

ncharには nvarcharよりもより多くのスペースが必要です。

例:

char(100)は、5だけを入力した場合でも常に100文字を格納します。 残りの95文字にはスペースが埋め込まれます。 varchar(100)に5文字を保存すると、5文字が保存されます。

nchar(10)は長さ10の固定長Unicode文字列です。nvarchar(10)は最大長10の可変長Unicode文字列です。通常、すべてのデータ値が10文字の場合は前者を使用します。長さが異なる場合は後者。

  • ncharは固定長で、Unicode文字を保持できます。文字ごとに2バイトのストレージを使用します。

  • varcharは可変長であり、Unicode文字を保持できません。文字ごとに1バイトのストレージを使用します。

NVARCHAR はUnicode文字を保存でき、文字ごとに2バイトを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top