SQL Serverのchar、nchar、varchar、nvarcharの違いは何ですか?
-
05-07-2019 - |
質問
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バイトです。
違いは次のとおりです。
- n [var] charはunicodeを格納しますが、[var] charはシングルバイト文字のみを格納します。
- [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バイトを使用します。