web-dev-qa-db-ja.com

VARCHAR2(10 CHAR)とNVARCHAR2(10)の違い

Oracle Database 10g Express Edition(Universal)をデフォルト設定でインストールしました:

SELECT * FROM NLS_DATABASE_PARAMETERS;

NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                

CHARNCHARの両方のデータ型がマルチバイト文字列を受け入れるように思われる場合、これら2つの列定義の正確な違いは何ですか?

VARCHAR2(10 CHAR)
NVARCHAR2(10)
54

NVARCHAR2 データ型は、一部の列にUnicodeを使用し、残りのデータベースには別の文字セットを使用するデータベース用にOracleによって導入されました(VARCHAR2を使用)。 NVARCHAR2はUnicodeのみのデータ型です。

NVARCHAR2を使用する理由の1つは、DBが非Unicode文字セットを使用し、プライマリ文字セットを変更せずに一部の列のUnicodeデータを保存できるようにすることです。別の理由は、2つのUnicode文字セット(主に西ヨーロッパからのデータにはAL32UTF8、主にアジアからのデータにはAL16UTF16)を使用することです。異なる文字セットは同じデータを等しく効率的に保存しないためです。

例の両方の列(Unicode VARCHAR2(10 CHAR)およびNVARCHAR2(10))は同じデータを格納できますが、バイトの格納は異なります。一部の文字列は、どちらかに効率的に保存される場合があります。

また、一部の機能はNVARCHAR2では機能しないことに注意してください。このSOの質問:

86
Vincent Malgrat
  • _NVARCHAR2_は可変長の文字データを格納します。 _NVARCHAR2_列を使用してテーブルを作成する場合、最大サイズは常に文字長セマンティクスになります。これは、_NVARCHAR2_データ型のデフォルトで唯一の長さセマンティクスでもあります。

    _NVARCHAR2_ data型は、_AL16UTF16_エンコーディングでUnicodeデータをエンコードする_UTF-16_ characterセットを使用します。 _AL16UTF16_は、_2 bytes_を使用して文字を格納します。さらに、_NVARCHAR2_の最大バイト長は、構成された各国語文字セットによって異なります。

  • _VARCHAR2_ _VARCHAR2_の最大サイズは、バイトまたは文字のいずれかです。その列は、デフォルトの文字セットの文字のみを保存できますが、_NVARCHAR2_は事実上すべての文字を保存できます。単一の文字には最大_4 bytes_が必要になる場合があります。

フィールドを次のように定義することにより:

  • VARCHAR2(10 CHAR)は、各文字を格納するのに何バイトを要しても、10文字を格納するのに十分なスペースを使用できることをOracleに伝えます。単一の文字には最大_4 bytes_が必要になる場合があります。
  • NVARCHAR2(10)は、1文字につき_2 bytes_で10文字を格納できることをOracleに伝えます

要約:

  • VARCHAR2(10 CHAR)は、最大_10 characters_および最大_40 bytes_を保存できます(設定された各国語文字セットによって異なります)。

  • NVARCHAR2(10)は、最大_10 characters_および最大_20 bytes_を保存できます(設定された各国語文字セットによって異なります)。

注:文字セットは_UTF-8_、_UTF-16_、....

詳細については このチュートリアル をご覧ください。

良い一日を過ごしてください!

4
Chivorn

Vincent Malgratからの答えは正しいとは思わない。 NVARCHAR2導入だったとき、昔は誰もUnicodeについて話していませんでした。

当初、OracleはVARCHAR2およびNVARCHAR2を提供してローカライズをサポートしていました。一般的なデータ(PL/SQLを含む)はVARCHAR2で保持されていましたが、最近ではUS7ASCIIである可能性が高いです。その後、アプリケーションの共通部分に触れることなく、任意の国の顧客ごとにNLS_NCHAR_CHARACTERSETを個別に適用できます(例:WE8ISO8859P1)。

現在、文字セットAL32UTF8はUnicodeを完全にサポートするデフォルトです。今日の私の意見では、NLS_NCHAR_CHARACTERSET、つまりNVARCHAR2NCHAR2NCLOBを使用する理由はもうありません。 NVARCHAR2をサポートしないOracleネイティブ関数がますます増えていることに注意してください。そのため、NVARCHAR2は本当に避ける必要があります。おそらく唯一の理由は、AL16UTF16AL32UTF8と比較して消費するストレージが少ないアジア文字を主にサポートする必要がある場合です。

3

nVarchar2はUnicode-onlyストレージです。

両方のデータ型は可変長の文字列データ型ですが、値の格納方法の違いに気付くことができます。各文字はバイト単位で保存されます。私たちが知っているように、すべての言語が同じ長さのアルファベットを持っているわけではありません。たとえば、英語のアルファベットは文字ごとに1バイトを必要とします。

varchar2(10)を指定すると、10バイトのデータのみが保存されることをDBに伝えています。しかし、nVarchar2(10)と言うとき、それは10文字が保存されることを意味します。この場合、各文字のバイト数を心配する必要はありません。

1
Pooja