varcharとnvarcharの違いは何ですか?
-
02-07-2019 - |
質問
nvarchar
はマルチバイト文字をサポートしているだけですか?その場合、ストレージの問題以外に、 varchars
を使用することに本当にポイントがありますか?
解決
nvarchar
列には、任意のUnicodeデータを格納できます。 varchar
列は、8ビットのコードページに制限されています。一部の人々は、 varchar
を使用する必要があると考えています。これは正しい答えではないと思います。コードページの非互換性は苦痛であり、ユニコードはコードページの問題の治療法です。最近の安価なディスクとメモリでは、もはやコードページをいじくり回す時間を無駄にする理由はありません。
最新のオペレーティングシステムと開発プラットフォームはすべて、内部的にUnicodeを使用しています。 varchar
ではなく nvarchar
を使用することで、データベースの読み取りまたは書き込みのたびにエンコード変換を行うことを回避できます。変換には時間がかかり、エラーが発生しやすくなります。また、変換エラーからの回復は重要な問題です。
ASCIIのみを使用するアプリケーションとインターフェイスする場合、データベースでUnicodeを使用することをお勧めします。 OSおよびデータベース照合アルゴリズムは、Unicodeでより適切に機能します。 Unicodeは、他のシステムとインターフェースする際の変換の問題を回避します。そして、あなたは未来に備えます。また、Unicodeストレージ全体のメリットを享受しながらも、保守する必要のあるレガシーシステムのデータが7ビットASCIIに制限されていることをいつでも検証できます。
他のヒント
私は、nvarcharを常に使用します。これは、私が構築するものが、投げたデータのほとんどに耐えられるようにするためです。 nvarcharを使用したため、私のCMSシステムは誤って中国語を実行します。最近では、新しいアプリケーションは実際に必要なスペースの量を気にするべきではありません。
Oracleのインストール方法によって異なります。インストールプロセス中に、NLS_CHARACTERSETオプションが設定されます。クエリ SELECT value $ FROM sys.props $ WHERE name = 'NLS_CHARACTERSET'
で見つけることができます。
NLS_CHARACTERSETがUTF8のようなUnicodeエンコーディングの場合、素晴らしい。 VARCHARとNVARCHARの使用はほとんど同じです。今読んで停止し、ちょうどそれのために行きます。それ以外の場合、またはOracleの文字セットを制御できない場合は、読み進めてください。
VARCHAR—データはNLS_CHARACTERSETエンコーディングで保存されます。同じサーバー上に他のデータベースインスタンスがある場合、それらによって制限される可能性があります。設定を共有する必要があるため、その逆も同様です。 このようなフィールドには、その文字セットを使用してエンコードできるデータのみを保存できますが、他には何も保存できません。たとえば、文字セットがMS-1252の場合、英語の文字、少数のアクセント付き文字、および他のいくつかの文字(€や—など)のみを保存できます。アプリケーションは少数のロケールでのみ有用であり、世界の他の場所で操作することはできません。このため、それは悪いアイデアと見なされます。
NVARCHAR—データはUnicodeエンコーディングで保存されます。すべての言語がサポートされています。良いアイデア。
ストレージスペースはどうですか? VARCHARは、特定のロケール向けに文字セット/エンコーディングがカスタム設計されているため、一般に効率的です。 NVARCHARフィールドはUTF-8またはUTF-16エンコーディングで格納されますが、皮肉なことにNLS設定に基づいています。 UTF-8は" Western"に対して非常に効率的です。言語、まだアジア言語をサポートしています。 UTF-16はアジア言語では非常に効率的ですが、「西部」を引き続きサポートしています。言語。ストレージスペースが心配な場合は、NLS設定を選択して、Oracleが適切にUTF-8またはUTF-16を使用するようにします。
処理速度はどうですか?ほとんどの新しいコーディングプラットフォームは、Unicodeをネイティブに使用します(Java、.NET、数年前のC ++ std :: wstringも!)。したがって、データベースフィールドがVARCHARの場合、Oracleは読み取りまたは書き込みごとに文字セット間の変換を強制します。 NVARCHARを使用すると、変換が回避されます。
下の行:NVARCHARを使用してください!制限と依存関係を回避し、ストレージスペースに適しています。通常はパフォーマンスにも最適です。
nvarcharはデータをUnicodeとして保存するため、データ列に多言語データ(複数の言語)を保存する場合は、Nバリアントが必要です。
私の2セント
-
正しいデータ型を使用しないと、インデックスが失敗する可能性があります:
SQL  Serverの場合:VARCHAR列にインデックスがあり、Unicode文字列を提示すると、SQL  Serverはインデックスを使用しません。 SmallIntを含むインデックス付き列にBigIntを提示する場合も同じことが起こります。 BigIntがSmallIntになるほど小さい場合でも、SQL  Serverはインデックスを使用できません。他の方法では、この問題は発生しません(SmallIntまたはAnsi-Codeをインデックス付きBigIntまたはNVARCHAR列に提供する場合)。 -
データタイプは、DBMS(データベース管理システム)によって異なる場合があります:
すべてのデータベースにはわずかに異なるデータ型があり、VARCHARはどこでも同じという意味ではありません。 SQL サーバーにはVARCHARとNVARCHARがありますが、Apache / DerbyデータベースにはVARCHARしかなく、VARCHARはUnicodeです。
主に nvarchar はUnicode文字を保存し、 varchar は非Unicode文字を保存します。
" Unicodes"は、アラビア語、ヘブライ語、中国語、日本語など、他の多くの言語の文字を単一の文字セットでエンコードできる16ビット文字エンコード方式を意味します。
つまり、Unicodeは1文字につき2バイトを格納に使用し、非Unicodeは1文字につき1バイトを格納に使用します。つまり、ユニコードは、非ユニコードと比較して、保存するために倍の容量が必要です。
その通りです。 nvarchar
はUnicodeデータを保存し、 varchar
はシングルバイト文字データを保存します。記憶域の違い( nvarchar
は varchar
の2倍の記憶域を必要とします)を除き、既に述べたように、 nvarchar
を varchar
は国際化になります(つまり、文字列を他の言語で保存します)。
私は言う、それは依存します。
デスクトップアプリケーションを開発し、OSがUnicode(現在のすべてのWindowsシステムなど)で動作し、言語がネイティブにUnicodeをサポートしている場合(デフォルトの文字列はJavaやC#などのUnicode)、nvarcharに移動します。
文字列がUTF-8で入力され、言語がPHPであり、まだUnicodeをネイティブにサポートしていない(バージョン5.xで)Webアプリケーションを開発する場合は、おそらくvarcharの方が適しています。
nVarcharは、Unicode文字を保存するのに役立ちます。ローカライズされたデータを保存する場合の方法です。
1バイトを使用して文字を保存する場合、256通りの組み合わせが可能なため、256種類の文字を保存できます。照合は、文字と、それらを比較およびソートするルールを定義するパターンです。
1252はLatin1(ANSI)であり、最も一般的です。シングルバイト文字セットは、多くの言語で使用されるすべての文字を保存するには不十分です。たとえば、一部のアジア言語には数千の文字があるため、文字ごとに2バイトを使用する必要があります。
Unicode標準
複数のコードページを使用するシステムがネットワークで使用される場合、通信の管理が困難になります。物事を標準化するために、ISOおよびUnicodeコンソーシアムは Unicode を導入しました。 Unicodeは2バイトを使用して各文字を格納します。つまり、65,536の異なる文字を定義できるため、ほとんどすべての文字をUnicodeでカバーできます。 2台のコンピューターがUnicodeを使用する場合、すべてのシンボルは同じ方法で表され、変換は必要ありません-これはUnicodeの背後にある考え方です。
SQL Serverには、文字データ型の2つのカテゴリがあります:
- 非ユニコード(char、varchar、およびtext)
- Unicode(nchar、nvarchar、ntext)
複数の国の文字データを保存する必要がある場合は、常にUnicodeを使用してください。
NVARCHAR
はUnicodeを保存しますが、照合の助けを借りて、 VARCHAR
を使用してローカル言語のデータを保存することも検討してください。
次のシナリオを想像してください。
DBの照合はペルシャ語であり、「علی」のような値を保存します(アリのペルシャ語表記) VARCHAR(10)
データ型。問題はなく、DBMSは3バイトのみを使用して保存します。
ただし、データを別のデータベースに転送して正しい結果を確認する場合、宛先データベースには、この例のペルシア語と同じ照合順序が必要です。
ターゲット照合が異なる場合、ターゲットデータベースに疑問符(?)が表示されます。
最後に、ローカル言語を使用するための巨大なデータベースを使用している場合は、スペースを使いすぎずに場所を使用することをお勧めします。
デザインは異なる可能性があると思います。作業環境によって異なります。
ここで言う必要があります(おそらくスレートに自分自身を開放するつもりだと思います!)が、確かに NVARCHAR
が実際には more VARCHAR
よりも便利です( more に注目してください!)は、すべての依存システムとデータベース内のすべての照合が同じ場合です...?そうでない場合、照合変換はとにかく発生する必要があるため、 NVARCHAR
と同じように VARCHAR
を実行可能にします。
これに追加するため、 SQL Server(2012年以前)などの一部のデータベースシステムには、約のページサイズ。 8K。したがって、 TEXT
や NTEXT
フィールドのようなものに保持されていない検索可能なデータの保存を検討している場合、 VARCHAR
は8kの価値を提供します。一方、 NVARCHAR
は4k(2倍のバイト、2倍のスペース)しか提供しません。
要約すると、どちらの使用は次のものに依存すると思われます:
- プロジェクトまたはコンテキスト
- インフラストラクチャ
- データベースシステム
フォロー SQL Server VARCHARとNVARCHARデータ型 。ここでは非常にわかりやすい方法で見ることができます。
一般に、nvarcharはデータをUnicodeとして保存するため、データ列に多言語データ(複数の言語)を保存する場合は、Nバリアントが必要です。
答えを見て、多くの人が varchar
よりも nvarchar
を使用することをお勧めしているようです。少しの追加ストレージ用のユニコード。さて、列にインデックスを適用する場合、これは必ずしも当てはまりません。 SQL Serverでは、インデックスを作成できるフィールドのサイズに900バイトの制限があります。したがって、 varchar(900)
がある場合でも、インデックスを作成できますが、 varchar(901)
は作成できません。 nvarchar
を使用すると、文字数が半分になるため、最大 nvarchar(450)
までインデックスを作成できます。したがって、 nvarchar
は必要ないと確信している場合は、使用しないことをお勧めします。
一般に、データベースでは、いつでも拡張できるため、必要なサイズに固執することをお勧めします。たとえば、職場の同僚は、ストレージにまったく問題がないため、列に nvarchar(max)
を使用しても害はないと考えていました。後で、この列にインデックスを適用しようとしたときに、SQL Serverはこれを拒否しました。しかし、彼が varchar(5)
で始めた場合、この問題を修正するためにフィールド移行計画を実行する必要があるような問題が発生することなく、後で必要なものに単純に拡張できました。
〜47000レピュテーションスコアを持つジェフリーLホイットレッジは、nvarcharの使用を推奨しています
〜33200レピュテーションスコアを持つソロモンラッツキーの推奨事項:常にNVARCHARを使用しないでください。それは非常に危険であり、しばしば費用のかかる態度/アプローチです。
主なパフォーマンスは何ですかvarcharとnvarchar SQL Serverのデータ型の違いは?
https://www.sqlservercentral.com/articles/disk -is-cheap-orly-4
このような評判の高い人、学習SQLサーバーデータベース開発者は何を選択しますか?
選択肢に一貫性がない場合、パフォーマンスの問題に関する回答とコメントには多くの警告があります。
パフォーマンスに関するコメントpro / con nvarcharがあります。
パフォーマンスに関するコメントpro / con varcharがあります。
何百もの列があるテーブルには特別な要件がありますが、それ自体はおそらく珍しいことでしょうか?
varcharを選択して、SQL * server 2012の8060バイトのテーブルレコードサイズ制限に近づかないようにします。
nvarcharの使用は、私にとっては、この8060バイトの制限を超えています。
また、関連するコードテーブルのデータ型をプライマリ中央テーブルのデータ型に一致させるべきだと考えています。
以前の経験豊富なデータベース開発者による南オーストラリア政府のこの職場でのvarchar列の使用は、表の行数が数百万以上になる(そして、もしあれば、nvarchar列は非常に少ない)これらの非常に大きなテーブル)、したがって、おそらく予想されるデータ行ボリュームがこの決定の一部になるでしょう。
nvarchar
はユニコード文字も許可するため、 varchar
に比べて nvarchar
は安全に使用できます。 。
SQL Serverクエリで where
条件を使用し、 =
演算子を使用している場合、エラーが発生することがあります。この理由として、マッピング列が varchar
に限定されることが考えられます。 nvarchar
で定義した場合、この問題は発生しません。それでも、 varchar
にこだわり、この問題を回避するには、 =
ではなく LIKE
キーワードを使用することをお勧めします。