nvarchar
とはどういう意味ですか?
SQL Serverのchar
、nchar
、varchar
、およびnvarchar
の違いは何ですか?
ただ片付けるためには...または要約すると...
nchar
とnvarchar
には、Unicode文字を格納できます。char
およびvarchar
Unicodeを格納できません文字。char
とnchar
は固定長で、使い切っていなくても、指定した文字数に対して記憶域の確保すべてのスペース.varchar
およびnvarchar
は可変長であり、格納した文字のスペースを使い切るだけになります。それはchar
やnchar
のような記憶域を予約しませんです。nchar
とnvarchar
は2倍の記憶領域を占有するため、 Unicode supportが必要な場合にのみ使用するのが賢明です。
これまでのすべての答えは、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
バージョンでは表されておらず、黙って?
に置き換えられています。
その照合順序でシングルバイトで表現できる漢字は実際にはまだありません。唯一の半角文字は典型的な西部のASCIIセットです。
このため、nvarchar(X)
列からvarchar(X)
列への挿入 が切り捨てエラー で失敗する可能性があります(ここで、Xは両方のインスタンスで同じ数値を表します)。
SQL Server 2012では、UTF-16
をサポートするSC(Supplementary Character)照合順序が追加されています。これらの照合では、単一の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
は文字ごとにexactly2バイトを使用して文字列を格納するのに対し、char
およびvarchar
照合コードページによって決定されたエンコーディングを使用します。これは通常、文字ごとに正確に1バイトになります(例外はありますが、以下を参照)。文字ごとに2バイトを使用すると、非常に広範囲の文字を格納できるため、ここで覚えておくべき基本的なことは、国際化サポートが必要な場合はnchar
とnvarchar
がはるかに良い選択であるということです。おそらくあなたはそうするでしょう。
いくつかの細かい点について説明します。
最初に、nchar
およびnvarchar
列alwaysは、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の範囲全体をカバーします。
char
:最大長8000文字の固定長文字データ。nchar
:最大長4000文字の固定長Unicodeデータ。Char
= 8ビット長NChar
= 16ビット長nchar[(n)]
(国別文字)
n
は文字列の長さを定義し、1から4,000までの値でなければなりません。n
バイトの2倍です。nvarchar [(n | max)]
(国別文字が異なります。)
n
は文字列の長さを定義し、1から4,000までの値になります。max
は、最大記憶域サイズが2 ^ 31-1バイト(2 GB)であることを示します。char [(n)]
(文字)
non-Unicode
文字列データ。n
は文字列の長さを定義し、1から8,000までの値でなければなりません。n
バイトです。varchar [(n | max)]
(文字が変わる)
n
は文字列の長さを定義し、1から8,000までの値になります。max
は、最大記憶域サイズが2 ^ 31-1バイト(2 GB)であることを示します。違いは です。
もう一つの違いは長さです。 ncharとnvarcharはどちらも最大4,000文字の長さです。また、charとvarcharは最大8000文字です。しかし、SQL Serverでは、最大2,147,483,648文字まで処理できる[n] varchar(max)を使用することもできます。 (2ギガバイト、符号付き4バイト整数)
ncharにはnvarcharよりも多くのスペースが必要です。
例えば、
5を入力しただけでも、char(100)は常に100文字を格納し、残りの95文字はスペースで埋められます。 varchar(100)に5文字を格納すると、5文字が節約されます。
nchar(10)は、長さ10の固定長Unicodeストリングです。nvarchar(10)は、最大長10の可変長Unicodeストリングです。通常、すべてのデータ値が10文字で後者の場合は前者を使用します。長さが異なる場合.
ncharは固定長で、Unicode文字を入れることができます。 1文字あたり2バイトの記憶域を使用します。
varcharは可変長で、Unicode文字を入れることはできません。 1文字あたり1バイトの記憶域を使用します。
_ nvarchar _ はUnicode文字を格納でき、1文字あたり2バイトを取ります。