web-dev-qa-db-ja.com

Oracleセッションクライアントの文字セットを決定しますか?

Iknowデータベースの文字セット(NLS_CHARACTERSETselect * from v$nls_parameters;)およびクライアント文字セット(クライアント環境設定NLS_LANG) 相互作用する。

しかし、私が見つけられないのは、確立されたセッションで、現在のクライアントの文字セットがどのように考えられているかを判断できるかどうかです。

これは可能ですか?

注意: SELECT * FROM NLS_SESSION_PARAMETERS;notに文字セットを含めます(10g2上)。

私が達成したいことを完全に明確にするために:

  1. NLS_LANGは、クライアント環境で任意の値に設定されます(たとえば、GERMAN_GERMANY.WE8MSWIN1252
  2. データベースアプリケーション[*]が起動し、Oracleデータベースへの接続/セッションを確立します。
  3. データベースアプリケーション[*]は、クライアントの文字セットがOracleであると想定するOracle(OS環境ではない)を「確認」する必要があります。

[*]:dbアプリケーションがsqlplusの場合、例は次のようになります。

...
sqlplus /nolog
connect user/pass@example
*magic command*;
   CLIENT CHARACTERSET = ...

彼の答えのジャックのノートは2つの重要なポイントを上げます:

  • Oracleでは、whoが文字セット変換を行います。それはクライアントライブラリコードですか、それともサーバー側で行われますか?
  • それがクライアントであるように見えるので、clientはこの設定を公開する必要があります-クライアントlib/toolがこの設定であると想定しているもの。この設定の内容を照会できるOracleクライアントlibs/tools(sqlplus、OCI/OCCI、Pro * Cなど)はありますか?
9
Martin

これがまさにあなたが探しているものであることは少し疑わしいですが、

Host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

は、クライアントのクライアントnls_lang環境変数を示しています。

私はサーバーがクライアント側でどのような変換が行われたかを認識していないため、「現在の」設定を指定するために実行できるSQLクエリはないと思います。現在の設定を表示するコマンドはすべてネイティブである必要がありますクライアントへ-上記のコマンドにSQL Developerを使用しましたが、SQL * Plusでも同じように機能すると想定しています

-編集

AskTomから

クライアントだけが自分の文字セットも知っています-「データベース」では利用できません

および

文字セットは、データベースに何が格納されているかを示します。

クライアントは、NLS_LANG設定を介して、目的の文字に変換された文字をデータベースに認識させます。

11.1以降を使用している場合は、v-session_connect_infoを使用して 多少の喜びがあるかもしれません を使用します。

この情報は、OCIによってログイン時にサーバーにプッシュされます。

しかし、それはまだ接続方法に依存していることを発見しました。たとえば、JDBC Thin DriverからOCIを使用していないため、情報はプッシュされません。

あなたは 以下 を見ることができます:

  • NLS_CALENDAR
  • NLS_CURRENCY
  • NLS_DATE_FORMAT
  • NLS_DATE_LANGUAGE
  • NLS_SORT
  • NLS_TERRITORY

例えば:

SQL> select sys_context('USERENV', 'NLS_TERRITORY') from dual;

SYS_CONTEXT('USERENV','NLS_TERRITORY')
--------------------------------------------------------------------------------
UNITED KINGDOM

1 row selected.
0
Gaius