私はそれを読んだと思ったNLS_CHARACTERSET
にはデータベースのエンコーディングがあり、NLS_LANG
クライアントのエンコーディング。あれは正しいですか?
それは、2つのエンコーディングが異なる可能性があることを意味しますか?
他のいくつかのドキュメントでは、NLS_LANG
はNLS_CHARACTERSET
。どのアサーションが真実ですか?
NLSパラメータを理解するのは非常に退屈な場合があるため、公式ドキュメントで「グローバリゼーションサポート環境の設定」という用語を検索することをお勧めします。
NLSは各国語サポートの略であり、さまざまなOracle製品で使用可能な複数のパラメーターの始まりです。
_NLS_LANG
_は、クライアント環境の_<LANGUAGE>_<TERRITORY>.<CHARACTER_SET>
_を定義する変数として記述されます。
有効なNLS_LANG設定の例は次のとおりです。
_NLS_LANG=AMERCICAN_AMERICA.US7ASCII
_
変数の個々の部分は、Oracleによる情報の表示方法を定義します。 _<LANGUAGE>
_がAMERICAN
の場合、メッセージ、日、月はアメリカのスペルを使用して表示されます。ソートもパラメータのこの部分の影響を受けます
テリトリーは、デフォルトの日付、金額の値の設定(_$
_記号など)、数値形式(300万ポイントを表示する_3,000,000.12
_など)に影響します12)
これはかなり興味深いものになります。 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
_パラメータは、データベースインスタンスの作成時に設定され、その後は変更しないでください。 (変更することはできますが、DATA DICTIONARYオブジェクトでもデータが破損する可能性があります)。このパラメーターは、データのエンコードを定義します...
...テーブルのCHAR
、_VARCHAR2
_、LONG
、CLOB
列。
...テーブルのNCHAR
、_NVARCHAR2
_およびNCLOB
列。
このパラメーターは、RDBMSシステムに、特定の列のストアデータを保持するエンコーディングを通知するために使用されます。
_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
_を使用してデータを表示およびデータベースに転送できます。
ディスプレイとストレージ
それらは異なる場合があります。簡単に説明すると、文字はNLS_CHARACTERSET
で定義されているようにデータベースに格納されます。クライアントがこの文字セットを使用できない場合。 NLS_LANG
もリージョンを保持します。クライアントがデータベースで想定されているように異なる通貨、日付形式、小数点/カンマを使用している場合、これも異なる場合があります。
はい、あなたの仮定は正しいです(他の答えを見てください)
それは、2つのエンコーディングが異なる可能性があることを意味しますか?
はい、実際にはalwaysデータベースにtwo文字セット、NLS_CHARACTERSET
とNLS_NCHAR_CHARACTERSET
があると考えると、それらは異なり、1つのステートメントで両方を使用できます。
NLS_CHARACTERSET
とNLS_NCHAR_CHARACTERSET
は通常異なります。したがって、NLS_LANG
はNLS_CHARACTERSET
とは異なるか、NLS_NCHAR_CHARACTERSET
とは異なります。
NLS_LANG FAQ でいくつかの有用な情報を見つけます。
他のいくつかのドキュメントでは、
NLS_LANG
はNLS_CHARACTERSET
によって定義されていると読みました。どのアサーションが真実ですか?
この発言は間違っているようです。ただし、私の印象では、TOAD
は最初にDB接続を開き、NLS_CHARACTERSET
値を読み取ってから、以前に読み取ったNLS_LANG
に従ってNLS_CHARACTERSET
が設定されている「最終」DB接続を開きます。しかし、これはそれを行うためのかなり洗練されたアプローチのようです。