【Oracle】表によるNLS_LANGUAGEの違い(nls_database_parameters、v$parameter等)
1. はじめに
Oracleの言語設定の初期化パラメータであるNLS_LANGUAGEを確認する場合、パッと思いつくSQLにこんなものがあります。
どれもNLS_LANGUAGEの値を取得している点では同じです。
しかし、これらの結果が一致しないことがあります。
一致しない理由について、これから整理します。
2. NLS_LANGUAGEについて、表ごとの違いとは
ポイントは2つ
- DB作成時の値か、今の値か
- v$nls_parametersの値は、OS依存である(環境変数NLS_LANGから導出される)
これが、参照する表によってNLS_LANGUAGEの値が異なる理由です。
3. NLS_LANGUAGEの設定値検証
検証を通して、理解を深めます。
データベースを作成する際、デフォルト言語を設定しますよね。
この値は、nls_database_parametersにおけるNLS_LANGUAGEです。DB作成時に設定する初期化パラメータとも言えます。
検証としてまずは「日本語」を設定し、DBを作成しました。
これによって、自動的にNLS_LANGUAGEはJAPANESEになります。
せっかく設定したこの値ですが、環境変数NLS_LANGが設定されていると、セッションの値として上書きされてしまいます。
私の検証環境(Windows)では環境変数NLS_LANGが設定されていませんでした。この状態でのNLS_LANGUAGEを見てみましょう。
SQL> show parameter nls_language
NAME TYPE VALUE
----------------------------- -------------------- -----------------------
nls_language string JAPANESE
SQL>
SQL> select parameter,value from nls_database_parameters where parameter = 'NLS_LANGUAGE';
PARAMETER VALUE
------------------------------------ ----------------------
NLS_LANGUAGE JAPANESE
SQL>
SQL> select parameter,value from v$nls_parameters where parameter = 'NLS_LANGUAGE';
PARAMETER VALUE
------------------------------------ ----------------------
NLS_LANGUAGE JAPANESE
SQL>
SQL> select name,value from v_$parameter where name = 'nls_language';
PARAMETER VALUE
------------------------------------ ----------------------
NLS_LANGUAGE JAPANESE
見事に全てJAPANESEですね。
では、環境変数NLS_LANGにAMERICAN_AMERICA.WE8MSWIN1252(英語)を設定して、変化を確認します。
SQL> show parameter nls_language
NAME TYPE VALUE
----------------------------- -------------------- -----------------------
nls_language string AMERICAN
SQL>
SQL> select parameter,value from nls_database_parameters where parameter = 'NLS_LANGUAGE';
PARAMETER VALUE
------------------------------------ ----------------------
NLS_LANGUAGE JAPANESE
SQL>
SQL> select parameter,value from v$nls_parameters where parameter = 'NLS_LANGUAGE';
PARAMETER VALUE
------------------------------------ ----------------------
NLS_LANGUAGE AMERICAN
SQL>
SQL> select name,value from v_$parameter where name = 'nls_language';
PARAMETER VALUE
------------------------------------ ----------------------
NLS_LANGUAGE AMERICAN
nls_database_parametersだけがJAPANESEで、それ以外は全てAMERICANですね。セッション値として上書きされた事が分かります。
以上で検証は終わりです。
少しでも皆さんの理解の助けになれたら幸いです。
(もし間違っている点があれば指摘をお願いします)
4. 参考
・検証環境/製品:Oracle Database 19c for Windows
・NLS_LANGUAGE
・NLS_DATABASE_PARAMETERS ・showコマンド ・環境変数NLS_LANG
Discussion