it-swarm.it

Determinare il set di caratteri del client della sessione Oracle?

I sapere come il set di caratteri del database (NLS_CHARACTERSET in select * from v$nls_parameters;) e il set di caratteri del client (impostazione dell'ambiente client NLS_LANG) interagire.

Ciò che non riesco a scoprire, tuttavia, è come o se posso determinare, per una sessione stabilita, quale Oracle ritiene sia il set di caratteri del client corrente.

È possibile?

Nota: SELECT * FROM NLS_SESSION_PARAMETERS; --- not include il set di caratteri (su 10g2).

Per chiarire assolutamente cosa mi piacerebbe realizzare:

  1. NLS_LANG è impostato nell'ambiente client su un valore arbitrario (ad esempio GERMAN_GERMANY.WE8MSWIN1252)
  2. L'applicazione di database [*] si avvia e stabilisce una connessione/sessione al database Oracle.
  3. L'applicazione di database [*] vuole "chiedere" Oracle (non il suo ambiente di sistema operativo) quale sarà il set di caratteri client Oracle.

[*]: Se l'applicazione db è sqlplus, l'esempio sarebbe simile al seguente:

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

La nota di Jack nella sua risposta solleva due punti importanti:

  • Con Oracle, who esegue la traduzione del set di caratteri. È il codice della libreria client o viene eseguito sul lato server?
  • Come sembra essere il client, client dovrebbe esporre questa impostazione - ciò che il lib/strumento client presume che questa impostazione sia. C'è qualcuno dei lib/strumenti client Oracle (sqlplus, OCI/OCCI, Pro * C, ...) che possono essere interrogati per quello che pensa questa impostazione?
9
Martin

Sono un po 'dubbioso che questo è esattamente quello che stai cercando, ma

Host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

mostra la variabile d'ambiente client nls_lang sul client.

Non credo che ci sarà una query SQL che puoi eseguire per fornire l'impostazione 'corrente' perché AFAIK il server non è a conoscenza di quale traduzione viene eseguita sul lato client, quindi qualsiasi comando per mostrare l'impostazione corrente dovrà essere nativo al client: ho usato SQL Developer per il comando sopra, ma presumo funzionerà allo stesso modo in SQL * Plus

--modificare

da AskTom :

solo il client conosce anche il proprio set di caratteri - non è disponibile "nel database"

e

il set di caratteri descrive ciò che è archiviato nel database.

il client fa conoscere il suo personaggio tradotto tradotto al personaggio [sic] nel database tramite l'impostazione NLS_LANG.

Se tu fossi su 11.1+, potresti avere un po 'di gioia con v $ session_connect_info, perché:

Queste informazioni vengono inviate da OCI al server durante l'ora di accesso.

Ma ho scoperto che dipenderà comunque dal modo in cui ti stai connettendo, ad esempio dal Thin Driver JDBC che non stai utilizzando OCI e quindi le informazioni non vengono inviate

Puoi vedere il seguente :

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

Per esempio:

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

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

1 row selected.
0
Gaius