60

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)
4

4 に答える 4

88

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

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

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

一部の機能はNVARCHAR2では機能しないことにも注意してください。次のSOの質問を参照してください。

于 2010-12-22T13:21:42.033 に答える
8

VincentMalgratからの答えは正しくないと思います。ずっと前NVARCHAR2紹介されたとき、誰もUnicodeについて話していませんでした。

当初、オラクルはローカリゼーションをサポートするために提供VARCHAR2しました。NVARCHAR2共通のデータ(PL / SQLを含む)はVARCHAR2、おそらく最近では保持されていましUS7ASCIIた。次に、アプリケーションの共通部分に触れることなく、任意の国の顧客ごとにNLS_NCHAR_CHARACTERSET個別に(たとえば)アプリケーションを適用できます。WE8ISO8859P1

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

于 2019-01-03T12:19:01.950 に答える
6
  • NVARCHAR2可変長文字データを格納します。列を使用してテーブルを作成する場合NVARCHAR2、最大サイズは常に文字長セマンティクスになります。これは、NVARCHAR2データ型のデフォルトで唯一の長さセマンティクスでもあります。

    NVARCHAR2データ型は、エンコーディングAL16UTF16でUnicodeデータをエンコードする文字セットを使用しUTF-16ます。文字を保存するためAL16UTF16使用2 bytes。さらに、の最大バイト長はNVARCHAR2、構成されている国別文字セットによって異なります。

  • VARCHAR2の最大サイズはVARCHAR2、バイトまたは文字のいずれかです。その列はデフォルトの文字セットにのみ文字を格納できますが、NVARCHAR2は事実上すべての文字を格納できます。1つの文字に最大。が必要な場合があります4 bytes

フィールドを次のように定義します。

  • VARCHAR2(10 CHAR)Oracleに、各文字を格納するのに必要なバイト数に関係なく、10文字を格納するのに十分なスペースを使用できることを伝えます。1つの文字に最大。が必要な場合があります4 bytes
  • NVARCHAR2(10)2 bytesOracleに、 1文字あたり 10文字を格納できることを伝えます

要約すれば:

  • VARCHAR2(10 CHAR)10 characters最大および最大を 格納でき40 bytesます(構成された国別文字セットによって異なります)。

  • NVARCHAR2(10)10 characters最大および最大を 格納でき20 bytesます(構成された国別文字セットによって異なります)。

注:文字セットは、、、...にすることができUTF-8ますUTF-16

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

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

于 2019-01-10T02:24:30.767 に答える
2

nVarchar2はUnicodeのみのストレージです。

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

varchar2(10)を指定すると、 10バイトのデータのみが格納されることをDBに通知します。ただし、nVarchar2(10)と言うと、 10文字が格納されることを意味します。この場合、各文字のバイト数を気にする必要はありません。

于 2017-12-02T18:57:22.290 に答える