web-dev-qa-db-ja.com

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

nvarcharとはどういう意味ですか?

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

569
MrDatabase

ただ片付けるためには...または要約すると...

  • ncharnvarcharには、Unicode文字を格納できます。
  • charおよびvarcharUnicodeを格納できません文字。
  • charnchar固定長で、使い切っていなくても、指定した文字数に対して記憶域の確保すべてのスペース.
  • varcharおよびnvarchar可変長であり、格納した文字のスペースを使い切るだけになります。それはcharncharのような記憶域を予約しませんです。

ncharnvarcharは2倍の記憶領域を占有するため、 Unicode supportが必要な場合にのみ使用するのが賢明です。

787
Brian Kim

これまでのすべての答えは、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  

返品

enter image description here

の文字はまだVARCHARバージョンでは表されておらず、黙って?に置き換えられています。

その照合順序でシングルバイトで表現できる漢字は実際にはまだありません。唯一の半角文字は典型的な西部のASCIIセットです。

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

SQL Server 2012では、UTF-16をサポートするSC(Supplementary Character)照合順序が追加されています。これらの照合では、単一のnvarchar文字が2または4バイトかかることがあります。

87
Martin Smith

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

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

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

33
Luke Bennett

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

そのため、 'nchar'フィールドでデータセットをフィルタ処理する場合は、スペースを削除するためにRTRIMを使用することをお勧めします。例えば。 BRANDと呼ばれるnchar(10)フィールドは、単語NIKEを格納します。それは御言葉の右側に6つのスペースを追加します。そのため、フィルタリングする場合、式は次のようになります。 RTRIM(Fields!BRAND.Value)= "NIKE"

私は今それに少し苦労していたので、これがそこに誰かを助けることを願っています!

32
Dimuthu

既存の回答をまとめて修正する私の試み:

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

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

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

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

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

UPDATE:SQL Server 2012以降、最終的に TF-16のコードページ があります。たとえば、Latin1_General_100_CI_AS_SCは、 Unicodeの範囲全体をカバーします。

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

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)](文字)

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

varchar [(n | max)](文字が変わる)

  • 可変長、 非Unicode 文字列データ。
  • nは文字列の長さを定義し、1から8,000までの値になります。
  • maxは、最大記憶域サイズが2 ^ 31-1バイト(2 GB)であることを示します。
  • ストレージサイズは、入力されたデータの実際の長さ+ 2バイトです。
9

違いは です。

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

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

7
Wim ten Brink

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

例えば、

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

7
Sunil

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

5
Jason Kresowaty
  • ncharは固定長で、Unicode文字を入れることができます。 1文字あたり2バイトの記憶域を使用します。

  • varcharは可変長で、Unicode文字を入れることはできません。 1文字あたり1バイトの記憶域を使用します。

4
Manu

_ nvarchar _ はUnicode文字を格納でき、1文字あたり2バイトを取ります。

1
Gustavo Rubio