Déterminer le jeu de caractères du client de session Oracle?

9

Je sais comment le jeu de caractères de la base de données ( NLS_CHARACTERSETen select * from v$nls_parameters;) et le jeu de caractères client (le paramètre d'environnement client NLS_LANG) interagissent.

Ce que je ne peux pas savoir cependant, c'est comment ou si je peux déterminer, pour une session établie , ce que Oracle pense que le jeu de caractères client actuel est.

Est-ce possible?

Remarque: SELECT * FROM NLS_SESSION_PARAMETERS;n'inclut pas le jeu de caractères (sur 10g2).

Pour clarifier ce que j'aimerais accomplir:

  1. NLS_LANG est défini dans l'environnement client sur une valeur arbitraire (par exemple GERMAN_GERMANY.WE8MSWIN1252)
  2. L'application de base de données [*] démarre et établit une connexion / session avec la base de données Oracle.
  3. L'application de base de données [*] veut "demander" à Oracle (et non à son environnement de système d'exploitation) ce que le jeu de caractères client est supposé par Oracle.

[*]: Si l'application db est sqlplus, l'exemple se présente comme suit:

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

La note de Jack dans sa réponse soulève deux points importants:

  • Avec Oracle, qui fait la traduction du jeu de caractères. Est-ce le code client-bibliothèque ou est-ce fait côté serveur?
  • Comme il semble que ce soit le client, le client devrait exposer ce paramètre - ce que la bibliothèque / l'outil client suppose que ce paramètre est. Existe-t-il des bibliothèques / outils client Oracle (sqlplus, OCI / OCCI, Pro * C, ...) qui peuvent être interrogés sur ce qu'il pense être ce paramètre?
Martin
la source

Réponses:

9

Je doute un peu que ce soit exactement ce que vous recherchez, mais

host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

affiche la variable d'environnement client nls_lang sur le client.

Je ne pense pas qu'il y aura une requête SQL que vous pouvez exécuter pour donner le paramètre «actuel» car AFAIK le serveur ne sait pas quelle traduction est effectuée côté client, donc toute commande pour afficher le paramètre actuel devra être native au client - J'ai utilisé SQL Developer pour la commande ci-dessus, mais je suppose que cela fonctionnera de la même manière dans SQL * Plus

--Éditer

de AskTom :

seul le client connaît également son jeu de caractères - il n'est pas disponible "dans la base de données"

et

le jeu de caractères décrit ce qui est stocké dans la base de données.

le client rend sa traduction traduite en caractère souhaitée [sic] dans la base de données via le paramétrage NLS_LANG.

Si vous étiez sur 11.1+, vous pourriez avoir de la joie avec v $ session_connect_info, car:

Ces informations sont transmises par OCI au serveur au moment de la connexion.

Mais j'ai découvert que cela dépendrait toujours de la façon dont vous vous connectez, par exemple à partir du pilote léger JDBC, vous n'utilisez pas OCI et donc les informations ne sont pas poussées

Jack dit d'essayer topanswers.xyz
la source
Eh bien, non, ce n'est pas exactement ce que je cherchais :-) - Mais vous soulevez un (deux) point (s) important (s), et si c'est vrai, je suppose que ce serait une réponse acceptable. J'ajouterai les deux points à la question.
Martin
Bah! (pour ne pas vous en vouloir) Mais Oracle l'a vraiment: "seul le client connaît également son jeu de caractères - il n'est pas disponible" dans la base de données " " et "le client fait ... connaître la base de données via le NLS_LANG" sont vraiment tout à fait le contraire, non? :-)
Martin
Oui, vous avez raison si Tom <> Oracle. Je pense qu'il est en train de trébucher sur ses mots - tout ce fil vaut bien l'écrémage ...
Jack dit d'essayer topanswers.xyz
1
Réponse acceptée pour le 1er lien - car cette question sur Ask Tom (de 2002) demande en fait la même chose "Je voudrais savoir s'il est possible de vérifier les paramètres NLS_LANG côté client dans n'importe laquelle des vues v $ ou nls_ une fois connecté à la base de données."
Martin
0

Vous pouvez voir ce qui suit :

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

Par exemple:

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

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

1 row selected.
Gaius
la source
Je suppose que mentionner sys_context ici est utile. Sinon, cela ne résout pas le problème de quel jeu de caractères .
Martin
Mon point est que ce sont les seules choses que le serveur connaît (ou se soucie).
Gaius