📝

【Oracle】表によるNLS_LANGUAGEの違い(nls_database_parameters、v$parameter等)

2024/03/13に公開

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
https://docs.oracle.com/cd/F19136_01/refrn/NLS_LANGUAGE.html#GUID-0DD64F19-BEF2-4B4B-A232-3BA3F8494949
・NLS_DATABASE_PARAMETERS
https://docs.oracle.com/cd/F19136_01/refrn/NLS_DATABASE_PARAMETERS.html#GUID-C66B1C71-58A5-4761-A3BD-AE22930C3960
・showコマンド
https://docs.oracle.com/cd/F19136_01/sqpug/SHOW.html#GUID-6BB1499D-E537-43D1-A209-401F5DB95E16
・環境変数NLS_LANG
https://docs.oracle.com/cd/F19136_01/ntdbi/configuring-locale-and-character-sets-using-environment-variable.html#GUID-3FB91F89-C2BF-4709-AFDF-5DB0DB3CC2C4

Discussion