Oracle Database 10g Express Edition(Universal)をデフォルト設定でインストールしました:
SELECT * FROM NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
CHAR
とNCHAR
の両方のデータ型がマルチバイト文字列を受け入れるように思われる場合、これら2つの列定義の正確な違いは何ですか?
VARCHAR2(10 CHAR)
NVARCHAR2(10)
NVARCHAR2 データ型は、一部の列にUnicodeを使用し、残りのデータベースには別の文字セットを使用するデータベース用にOracleによって導入されました(VARCHAR2を使用)。 NVARCHAR2はUnicodeのみのデータ型です。
NVARCHAR2を使用する理由の1つは、DBが非Unicode文字セットを使用し、プライマリ文字セットを変更せずに一部の列のUnicodeデータを保存できるようにすることです。別の理由は、2つのUnicode文字セット(主に西ヨーロッパからのデータにはAL32UTF8、主にアジアからのデータにはAL16UTF16)を使用することです。異なる文字セットは同じデータを等しく効率的に保存しないためです。
例の両方の列(Unicode VARCHAR2(10 CHAR)
およびNVARCHAR2(10)
)は同じデータを格納できますが、バイトの格納は異なります。一部の文字列は、どちらかに効率的に保存される場合があります。
また、一部の機能はNVARCHAR2では機能しないことに注意してください。このSOの質問:
_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
_、....
詳細については このチュートリアル をご覧ください。
良い一日を過ごしてください!
Vincent Malgratからの答えは正しいとは思わない。 NVARCHAR2
が導入だったとき、昔は誰もUnicodeについて話していませんでした。
当初、OracleはVARCHAR2
およびNVARCHAR2
を提供してローカライズをサポートしていました。一般的なデータ(PL/SQLを含む)はVARCHAR2
で保持されていましたが、最近ではUS7ASCII
である可能性が高いです。その後、アプリケーションの共通部分に触れることなく、任意の国の顧客ごとにNLS_NCHAR_CHARACTERSET
を個別に適用できます(例:WE8ISO8859P1
)。
現在、文字セットAL32UTF8
はUnicodeを完全にサポートするデフォルトです。今日の私の意見では、NLS_NCHAR_CHARACTERSET
、つまりNVARCHAR2
、NCHAR2
、NCLOB
を使用する理由はもうありません。 NVARCHAR2をサポートしないOracleネイティブ関数がますます増えていることに注意してください。そのため、NVARCHAR2は本当に避ける必要があります。おそらく唯一の理由は、AL16UTF16
がAL32UTF8
と比較して消費するストレージが少ないアジア文字を主にサポートする必要がある場合です。
nVarchar2はUnicode-onlyストレージです。
両方のデータ型は可変長の文字列データ型ですが、値の格納方法の違いに気付くことができます。各文字はバイト単位で保存されます。私たちが知っているように、すべての言語が同じ長さのアルファベットを持っているわけではありません。たとえば、英語のアルファベットは文字ごとに1バイトを必要とします。
varchar2(10)を指定すると、10バイトのデータのみが保存されることをDBに伝えています。しかし、nVarchar2(10)と言うとき、それは10文字が保存されることを意味します。この場合、各文字のバイト数を心配する必要はありません。