Determinare il set di caratteri del client della sessione Oracle?


9

Io so come il set di caratteri del database ( NLS_CHARACTERSETin select * from v$nls_parameters;) e il set di caratteri client (l'ambiente client impostazione NLS_LANG) interagiscono.

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

Ciò è effettivamente possibile?

Nota: SELECT * FROM NLS_SESSION_PARAMETERS;non non includere 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" a Oracle (non al suo ambiente di sistema operativo) quale sarà il set di caratteri client che Oracle assumerà.

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

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

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

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

Risposte:


9

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 fossi su 11.1+, potresti provare 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 da come ti stai connettendo, ad esempio dal Thin Driver JDBC che non stai utilizzando OCI e quindi le informazioni non vengono inviate


Bene, no, non è esattamente quello che stavo cercando :-) - Ma sollevi un (due) punto / i importante / i e, se è vero, suppongo che sarebbe una risposta accettabile. Aggiungerò i due punti alla domanda.
Martin,

Bah! (per non biasimarti) Ma Oracle ce l'ha davvero: "solo il client conosce anche il proprio set di caratteri - non è disponibile" nel database " " e "il client fa conoscere ... al database tramite NLS_LANG" sono davvero affermando piuttosto il contrario, no? :-)
Martin

Sì, hai ragione anche se Tom <> Oracle. Penso che stia inciampando sulle sue parole - vale la pena scremare l'intero thread ...
Jack dice di provare topanswers.xyz il

1
Risposta accettata per il 1 ° link - perché questa domanda su Ask Tom (dal 2002) in realtà pone la stessa cosa "Vorrei sapere se è possibile controllare le impostazioni NLS_LANG sul lato client in una delle viste v $ o nls_ una volta connesso il database ".
Martin,

0

Puoi vedere quanto segue :

  • 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.

Immagino che sia utile menzionare sys_context qui. In caso contrario, questo non riesce a risolvere il problema di quale set di caratteri .
Martin,

Il mio punto è che queste sono le uniche cose di cui il server è a conoscenza (o che se ne frega).
Gaius,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.