web-dev-qa-db-ja.com

NLS_LANGおよびNLS_CHARACTERSET

私はそれを読んだと思ったNLS_CHARACTERSETにはデータベースのエンコーディングがあり、NLS_LANGクライアントのエンコーディング。あれは正しいですか?

それは、2つのエンコーディングが異なる可能性があることを意味しますか?

他のいくつかのドキュメントでは、NLS_LANGNLS_CHARACTERSET。どのアサーションが真実ですか?

2
mlwacosmos

NLSパラメータを理解するのは非常に退屈な場合があるため、公式ドキュメントで「グローバリゼーションサポート環境の設定」という用語を検索することをお勧めします。

NLSは各国語サポートの略であり、さまざまなOracle製品で使用可能な複数のパラメーターの始まりです。


NLS_LANG

_NLS_LANG_は、クライアント環境の_<LANGUAGE>_<TERRITORY>.<CHARACTER_SET>_を定義する変数として記述されます。

有効なNLS_LANG設定の例は次のとおりです。

_NLS_LANG=AMERCICAN_AMERICA.US7ASCII
_

言語

変数の個々の部分は、Oracleによる情​​報の表示方法を定義します。 _<LANGUAGE>_がAMERICANの場合、メッセージ、日、月はアメリカのスペルを使用して表示されます。ソートもパラメータのこの部分の影響を受けます

地域

テリトリーは、デフォルトの日付、金額の値の設定(_$_記号など)、数値形式(300万ポイントを表示する_3,000,000.12_など)に影響します12)

キャラクターセット

これはかなり興味深いものになります。 NLS_LANGパラメータのこの部分は、

...クライアントアプリケーションで使用される文字セット。

サマリーNLS_LANG

つまり、クライアントがデータベースに格納されているデータをどのように表示するかを構成しているのです。データベースに次のデータが含まれている場合:

_ Employee     | Employment Start    | Salary
--------------+---------------------+--------
 Michael Ward | 2018-01-01          | 100240
_

...次に、クライアントが_AMERICAN_AMERICA.US7ASCI_設定として_NLS_LANG_を設定している場合、このテーブルをクエリすると次のようになります。

_ Employee     | Employment Start     | Salary
--------------+----------------------+-------------
 Michael Ward | 01-JAN-18            | 100,240
_

..._FRENCH_FRANCE.WE8ISO8859P1_に設定すると、次のような結果になります。

_ Employee     | Employment Start     | Salary
--------------+----------------------+-------------
 Michael Ward | 01/01/18             | 100'240
_

他のパラメーターをフォローアップしましょう...


NLS_CHARACTERSET

_NLS_CHARACTERSET_パラメータは、データベースインスタンスの作成時に設定され、その後は変更しないでください。 (変更することはできますが、DATA DICTIONARYオブジェクトでもデータが破損する可能性があります)。このパラメーターは、データのエンコードを定義します...

NLS_CHARACTERSETパラメータ

...テーブルのCHAR、_VARCHAR2_、LONGCLOB列。

NLS_NCHAR_CHARACTERSETパラメータ

...テーブルのNCHAR、_NVARCHAR2_およびNCLOB列。

サマリーNLS_CHARACTERSET

このパラメーターは、R​​DBMSシステムに、特定の列のストアデータを保持するエンコーディングを通知するために使用されます。

_NLS_CHARACTERSET_、_AL8UTF8_、_AL32UTF8_(_AL16UTF16_(これは、 _NLS_NCHAR_CHARACTERSET_パラメータ)と他のすべての可能なUnicode設定との組み合わせでのみ使用できます。


比較

データベース列からデータを取得する場合、_NLS_LANG_は、取得されるデータにすべての標準(日付形式、時刻形式、数値形式)を追加します。

_NLS_CHARACTERSET_パラメーターは、データを列に格納するときに使用するエンコーディングを定義します。 (ASCII、Unicode、...)

あなたの質問に答える

それは、2つのエンコーディングが異なる可能性があることを意味しますか?

はい、まったく異なる2つのエンコーディングを使用できます。 _NLS_CHARACTERSET = AL32UTF8_の設定を使用してデータを保存しても、_NLS_LANG=American_America.US7ASCII_を使用してデータを表示およびデータベースに転送できます。

ディスプレイとストレージ

3

それらは異なる場合があります。簡単に説明すると、文字はNLS_CHARACTERSETで定義されているようにデータベースに格納されます。クライアントがこの文字セットを使用できない場合。 NLS_LANGもリージョンを保持します。クライアントがデータベースで想定されているように異なる通貨、日付形式、小数点/カンマを使用している場合、これも異なる場合があります。

0
Marco

はい、あなたの仮定は正しいです(他の答えを見てください)

それは、2つのエンコーディングが異なる可能性があることを意味しますか?

はい、実際にはalwaysデータベースにtwo文字セット、NLS_CHARACTERSETNLS_NCHAR_CHARACTERSETがあると考えると、それらは異なり、1つのステートメントで両方を使用できます。

NLS_CHARACTERSETNLS_NCHAR_CHARACTERSETは通常異なります。したがって、NLS_LANGNLS_CHARACTERSETとは異なるか、NLS_NCHAR_CHARACTERSETとは異なります。

NLS_LANG FAQ でいくつかの有用な情報を見つけます。

他のいくつかのドキュメントでは、NLS_LANGNLS_CHARACTERSETによって定義されていると読みました。どのアサーションが真実ですか?

この発言は間違っているようです。ただし、私の印象では、TOADは最初にDB接続を開き、NLS_CHARACTERSET値を読み取ってから、以前に読み取ったNLS_LANGに従ってNLS_CHARACTERSETが設定されている「最終」DB接続を開きます。しかし、これはそれを行うためのかなり洗練されたアプローチのようです。

0