it-swarm.dev

Ustalić zestaw znaków klienta sesji Oracle?

Ja wiem jak zestaw znaków bazy danych (NLS_CHARACTERSET w select * from v$nls_parameters;) i zestaw znaków klienta (ustawienie środowiska klienta NLS_LANG) oddziaływać.

Nie mogę jednak dowiedzieć się, w jaki sposób lub czy mogę ustalić, dla ustanowionej sesji, co według Oracle jest obecnym zestawem znaków klienta.

Czy to w ogóle jest możliwe?

Uwaga: SELECT * FROM NLS_SESSION_PARAMETERS; robi nie zawiera zestaw znaków (na 10g2).

Aby absolutnie wyjaśnić, co chciałbym osiągnąć:

  1. NLS_LANG jest ustawiony w środowisku klienta na dowolną wartość (na przykład GERMAN_GERMANY.WE8MSWIN1252)
  2. Aplikacja bazy danych [*] uruchamia się i ustanawia połączenie/sesję z bazą danych Oracle.
  3. Aplikacja bazy danych [*] chce „zapytać” Oracle (nie środowisko systemu operacyjnego), jaki zestaw znaków klienta to Oracle.

[*]: Jeśli aplikacja db to sqlplus, przykład wygląda następująco:

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

Notatka Jacka w odpowiedzi podnosi dwie ważne kwestie:

  • W przypadku Oracle who dokonuje translacji zestawu znaków. Czy to kod biblioteki klienta lub czy jest wykonywany po stronie serwera?
  • Wygląda na to, że to klient, klient musiałby ujawnić to ustawienie - to, co lib/narzędzie klienta zakłada, to ustawienie. Czy istnieje jakieś oprogramowanie/biblioteki klienta Oracle (sqlplus, OCI/OCCI, Pro * C, ...), które można zapytać o to, co według niego to ustawienie?
9
Martin

Wątpię, czy właśnie tego szukasz, ale

Host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

pokazuje klientowi zmienną środowiskową nls_lang.

Nie sądzę, aby można było uruchomić zapytanie SQL, aby podać „bieżące” ustawienie, ponieważ AFAIK serwer nie wie, jakie tłumaczenie jest wykonywane po stronie klienta, więc każde polecenie pokazujące bieżące ustawienie będzie musiało być rodzime do klienta - użyłem SQL Developer dla powyższego polecenia, ale zakładam, że będzie działać tak samo w SQL * Plus

--edytować

z AskTom :

tylko klient zna również zestaw znaków - nie jest dostępny „w bazie danych”

i

zestaw znaków opisuje, co jest przechowywane w bazie danych.

klient przetłumaczy żądaną postać na znak [sic] do bazy danych poprzez ustawienie NLS_LANG.

Jeśli masz 11.1+, możesz mieć trochę radości z v $ session_connect_info, ponieważ:

Informacje te są przekazywane przez OCI do serwera w czasie logowania.

Ale odkryłem, że nadal będzie to zależeć od tego, jak się łączysz, np. Z cienkiego sterownika JDBC nie używasz OCI, więc informacje nie są przekazywane

Możesz zobaczyć następujące :

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

Na przykład:

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

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

1 row selected.
0
Gaius