it-swarm-eu.dev

Určit znakovou sadu klienta relace Oracle?

I vím jak sada znaků v databázi (NLS_CHARACTERSET v select * from v$nls_parameters;) a znaková sada klienta (nastavení klientského prostředí NLS_LANG) komunikovat.

Co však nemůžu zjistit, je, jak nebo jestli mohu určit, pro zavedenou relaci, co si Oracle myslí, že aktuální sada znaků klienta je.

Je to vůbec možné?

Poznámka: SELECT * FROM NLS_SESSION_PARAMETERS; neobsahuje ne znakovou sadu (na 10g2).

Aby bylo zcela jasné, čeho bych chtěl dosáhnout:

  1. NLS_LANG je v klientském prostředí nastavena na libovolnou hodnotu (například GERMAN_GERMANY.WE8MSWIN1252)
  2. Databázová aplikace [*] spustí a naváže připojení/relaci k databázi Oracle.
  3. Databázová aplikace [*] se chce "zeptat" Oracle (nikoli jeho prostředí OS), co je znaková sada klienta, kterou Oracle předpokládá.

[*]: Pokud je aplikace db sqlplus, příklad by vypadal takto:

...
sqlplus /nolog
connect user/[email protected]
*magic command*;
   CLIENT CHARACTERSET = ...

Jackova poznámka ve své odpovědi vyvolává dva důležité body:

  • S Oracle provede who překlad sady znaků. Je to kód knihovny klientů nebo se provádí na straně serveru?
  • Jak se zdá, je to klient, klient bude muset toto nastavení odhalit - to, co klient/nástroj předpokládá, je toto nastavení. Existuje některý z nástrojů/nástrojů klienta Oracle (sqlplus, OCI/OCCI, Pro * C, ...), které lze dotazovat na to, co si myslí, že toto nastavení je?
9
Martin

Trochu pochybuji, že to je přesně to, co hledáte, ale

Host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

ukazuje proměnnou prostředí klienta nls_lang na klientovi.

Nemyslím si, že bude existovat dotaz SQL, který můžete spustit, abyste dali „aktuální“ nastavení, protože server AFAIK si není vědom toho, jaký překlad se provádí na straně klienta, takže jakýkoli příkaz k zobrazení aktuálního nastavení bude muset být nativní klientovi - pro výše uvedený příkaz jsem použil SQL Developer, ale předpokládám, že to bude fungovat i v SQL * Plus

--Upravit

od AskTom :

pouze klient zná jejich znakovou sadu - není k dispozici „v databázi“

a

znaková sada popisuje, co je uloženo v databázi.

klient prostřednictvím převodu NLS_LANG informuje o svých požadovaných překladech do znaku [sic] do databáze.

Pokud jste byli na 11.1+, můžete mít nějakou radost s v $ session_connect_info, protože:

Tyto informace jsou posílány OCI na server při přihlášení.

Ale zjistil jsem, že to bude stále záviset na tom, jak se připojujete, např. Z JDBC Thin Driveru nepoužíváte OCI, a tak informace nejsou tlačeny

Můžete vidět následující :

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

Např:

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

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

1 row selected.
0
Gaius