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


623

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

違いは何ですかcharncharvarchar、およびnvarcharSQL Serverでは?

回答:


857

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

  • nchar及びnvarchar保存することができますUnicodeの文字が。
  • charおよびUnicodeの保存ができない文字が。varchar
  • charまたnchar固定長であるため、指定した文字数分のストレージスペース予約れますが、そのスペースをすべて使用していなくてもかまいません。
  • varcharそして、nvarcharされている可変長だけが保管文字にスペースを使用します。それはのようなストレージを予約しませんcharnchar

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


15
charとvarcharはユニコードを格納するためのものではありませんが、いくつかの追加のコーディングトリックと追加のロジックにより、[var] charフィールドをユニコードストレージに誤用する可能性があります。
Wim ten Brink

10
n...バージョンが私の回答が示す
Martin Smith

7
ストレージを予約する利点は何ですか?
mlissner 2013

4
最後のポイント:ほとんどの場合、Unicode ncharとnvarcharを使用するほうが優れており、より良い照合、ユーザーの柔軟性により、将来の互換性の問題がなくなります。ちなみに、この場合、ストレージスペースは問題ではありません。Unicodeを使用せずに照合を使用することは非常に面倒であり、メモリレートは今後も減少し続けるでしょう
Jaison Varghese 2013

6
@BenCaine char(20)は20バイトを使用します(8ビット照合を想定)。varchar(20)はlen(data)+2バイトを使用します。つまり、20バイトのデータの場合は22ですが、10バイトのデータの場合は12のみです。余分な2バイトは長さレコードです。データが常に完全な長さである場合は、charを使用します。これは、スペースを節約し、より高速になる可能性があるためです。varchar(1)や、varchar(4)よりも小さいものは絶対に使用しないでください。varchar形式の単一の文字は3バイトを使用するため、char(3)がvarchar(3)よりも多くのスペースを使用することはありません。
リチャードガズデン14

95

これまでのすべての回答は、それ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では、をサポートするSC(補足文字)照合が追加されていますUTF-16。これらの照合では、1つのnvarchar文字に2バイトまたは4バイトかかる場合があります。


4
私が探していたような答え。また、私の好きに時間を節約する-英語以外のテキストは、「中華人民共和国」に変換translate.google.com/#auto/en/...
Igand

34

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

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

この質問は、重複のある、この1


3
1つ忘れてしまいます。ncharは固定長を使用するため、nchar(10)は常に10文字を受け取る必要があります。また、varchar(10)は実際にはUnicodeであり、最大10文字までの任意の数の文字を受け入れます。msdn.microsoft.com/en-us/library/ms186939.aspx
Wim ten Brink

33

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

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

これが少しの間苦労していたので、これが誰かの役に立つことを願っています!


24

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

まず、charそしてnchar常に、利用可能な空間よりも小さくなっているのに対し、文字列を格納する場合であっても、記憶空間の固定された量を使用するvarcharnvarchar、文字列(プラスオーバーヘッドの2バイトことを記憶するために必要されるだけ多くの収納スペースとして使用します、おそらく文字列の長さを格納します)。したがって、変数スペースの場合と同様に、「var」は「変数」を意味します。

理解するための第二の主要点は、つまり、ncharおよびnvarchar使用してストアの文字列を正確に文字あたり2バイトを、一方charおよびvarcharエンコーディングを使用します照合コードページによって決定通常の文字ごとに1つのバイトである(例外はありますが、以下を参照してください)。ここで覚えておくべき基本的なことがあることであるので、1文字ごとに2つのバイトを使用することにより、文字の非常に広い範囲が、保存することができますncharし、nvarcharあなたはおそらく行う国際化サポートを、欲しいときより良い選択をする傾向があります。

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

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

もう一つの混乱が、他のポスターが強調していることは興味深い点は、ということであるcharvarchar照合コードページがそれを必要とする場合のフィールドが特定の文字に1文字ごとに2つのバイトを使用することができます。(マーティン・スミスは、Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WSがこの動作をどのように示すかを示す優れた例を示しています。確認してください。)

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


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

char8ビット長にすることはできません。長さを格納する必要はありません。固定長は最大8000文字です。
John B. Lambe

12

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バイトです。

7

違いは次のとおりです。

  1. n [var] charはユニコードを格納しますが、[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

ncharはnvarchar よりも多くのスペースを必要とします

例えば、

nchar(100)は、5のみを入力した場合でも常に100文字を格納します。残りの95文字にはスペースが埋め込まれます。nvarchar(100)に5文字を格納すると、5文字が節約されます。


6
char(100)に最大100文字を入力する必要があるため、完全には当てはまりません。たとえば、データベースに電話番号を保存する場合や、固定長の番号を注文する場合に使用します。フィールド長は固定されているため、最大文字数まで入力することはできません。ただし、すべてのデータが1レコードあたり100文字である場合、char(100)は、長さを示す必要がないため、varchar(100)よりもストレージが少なくなります。すべての値は正確に100文字になります。
Wim ten Brink

5

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


誤った比較-質問は、ncharとvarcharではなく、ncharとvarcharに関連しています。
ルークベネット

4
  • ncharは固定長で、Unicode文字を保持できます。1文字あたり2バイトのストレージを使用します。

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


違う。Unicodeでは、すべての文字に1〜4バイト(通常)を使用できます。また、varcharはUnicodeを保持できますが、Unicodeとして認識されません。その結果、varcharはユニコードストレージとして信頼できないと見なされます。(特に、フィールドにアクセスするコードが誤って変換するリスクがあるため)
Wim ten Brink

@アレックス:あなたはあなたの主張をしたと思いますが、私はまだあなたに同意しません。あなたが言っているのは、ロングがたまたま2 ^ 32より小さい場合、intはロングを保持できるということです。これは「信頼できない」だけでなく、値の範囲全体をカバーすることを不可能にする固有の制限です。
マヌ

4
@ワークショップアレックス:間違っています。UnicodeエンコードUCS-2(これはSQL Serverで使用されるエンコードです)は、すべての文字を正確に 2バイトで格納します。msdn.microsoft.com / en- us / library / bb330962%28v=sql.90%29.aspxを参照してくださいSQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)。SQL Server 2008はSCSU圧縮を使用できますが、UCS-2でエンコードされたUnicode文字列の圧縮のままです:msdn.microsoft.com/en-us/library/ee240835.aspx
Remus Rusanu

2

NVARCHARはUnicode文字を格納でき、1文字あたり2バイトを使用します。


1
違う!Unicodeは1文字あたり1〜4バイトを使用します。多くの人はこれを忘れています!UTF-16を使用しても、一部の文字が2バイトではなく4バイトになる可能性がありますが、一般的な長さは2バイトです。Unicodeの他の特定のサブフォーマットは、4バイトを超える場合もあります。
Wim ten Brink

7
@WimtenBrink-問題はSQL Serverに関するものであり、nvarchar常に1文字あたり2バイトを使用します。
マーティン・スミス

@Wim、正解です。Unicodeには、バイト数が異なるエンコードがいくつかあります。ただし、SQL Serverでは、Unicodeエンコーディングについては選択できません。2012年より前のSQL Serverは、2バイト幅のUCS-2のみを使用していたため、マーティンは答えを書いた時点で正しかった。上記の他の回答で述べたように、SQL Server 2012はUTF-16を提供しているため、多くの文字(Unicode Basic Multiliingual Planeの文字)に2バイト、その他の文字に4バイト。
コンクリートガネット2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.