Zeichensatz für Oracle-Sitzungsclient ermitteln?


9

Ich weiß, wie der Datenbankzeichensatz ( NLS_CHARACTERSETin select * from v$nls_parameters;) und der Clientzeichensatz (die Clientumgebungseinstellung NLS_LANG) interagieren.

Was ich jedoch nicht herausfinden kann, ist, wie oder ob ich für eine etablierte Sitzung bestimmen kann , was Oracle für den aktuellen Client-Zeichensatz hält.

Ist das überhaupt möglich?

Hinweis: SELECT * FROM NLS_SESSION_PARAMETERS;nicht nicht den Zeichensatz enthält (auf 10g2).

Um absolut klar zu machen, was ich erreichen möchte:

  1. NLS_LANG wird in der Clientumgebung auf einen beliebigen Wert gesetzt (zum Beispiel GERMAN_GERMANY.WE8MSWIN1252).
  2. Die Datenbankanwendung [*] startet und stellt eine Verbindung / Sitzung zur Oracle-Datenbank her.
  3. Die Datenbankanwendung [*] möchte Oracle (nicht seine Betriebssystemumgebung) "fragen", welchen Oracle-Zeichensatz Oracle annehmen wird.

[*]: Wenn die Datenbankanwendung sqlplus ist, sieht das Beispiel wie folgt aus:

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

Jacks Notiz in seiner Antwort wirft zwei wichtige Punkte auf:

  • Mit Oracle, der die Zeichensatzübersetzung durchführt. Ist es der Client-Bibliothekscode oder wird er auf der Serverseite ausgeführt?
  • Wie es scheint, ist es der Client, der Client müsste diese Einstellung verfügbar machen - was die Client-Bibliothek / das Client-Tool unter dieser Einstellung annimmt. Gibt es eine der Oracle-Client-Bibliotheken / -Tools (sqlplus, OCI / OCCI, Pro * C, ...), die nach ihrer Meinung nach abgefragt werden können?

Antworten:


9

Ich bin ein wenig zweifelhaft, dass dies genau das ist, wonach Sie suchen, aber

host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

Zeigt die Umgebungsvariable des Clients nls_lang auf dem Client an.

Ich glaube nicht, dass es eine SQL-Abfrage geben wird, die Sie ausführen können, um die 'aktuelle' Einstellung anzugeben, da AFAIK dem Server nicht bekannt ist, welche Übersetzung clientseitig durchgeführt wird. Daher muss jeder Befehl zum Anzeigen der aktuellen Einstellung nativ sein an den Client - Ich habe SQL Developer für den obigen Befehl verwendet, aber ich gehe davon aus, dass es in SQL * Plus genauso funktioniert

--bearbeiten

von AskTom :

Nur der Client kennt auch seinen Zeichensatz - er ist "in der Datenbank" nicht verfügbar.

und

Der Zeichensatz beschreibt, was in der Datenbank gespeichert ist.

Der Client macht das gewünschte übersetzte Zeichen über die NLS_LANG-Einstellung in der Datenbank bekannt.

Wenn Sie auf 11.1+ waren, könnten Sie mit v $ session_connect_info etwas Freude haben, weil:

Diese Informationen werden von OCI zum Zeitpunkt der Anmeldung an den Server übertragen.

Ich habe jedoch festgestellt, dass es immer noch davon abhängt, wie Sie eine Verbindung herstellen, z. B. über den JDBC Thin Driver, dass Sie OCI nicht verwenden und die Informationen daher nicht übertragen werden


Nun, nein, es ist genau nicht das, wonach ich gesucht habe :-) - Aber Sie sprechen einen (zwei) wichtigen Punkt an, und wenn es wahr ist, wäre es wahrscheinlich eine akzeptable Antwort. Ich werde die beiden Punkte zur Frage hinzufügen.
Martin

Bah! (um Ihnen keine Vorwürfe zu machen) Aber Oracle hat es wirklich: "Nur der Client kennt auch seinen Zeichensatz - er ist nicht verfügbar" in der Datenbank " " und "der Client macht ... der Datenbank über das NLS_LANG" sind bekannt wirklich ganz im Gegenteil, nein? :-)
Martin

Ja, Sie haben Recht, obwohl Tom <> Oracle. Ich denke, er stolpert über seine Worte - dieser ganze Thread ist es wert
, überflogen

1
Akzeptierte Antwort für den ersten Link - da diese Frage auf Ask Tom (aus dem Jahr 2002) tatsächlich dasselbe fragt: "Ich würde gerne wissen, ob es möglich ist, die clientseitigen NLS_LANG-Einstellungen in einer der v $ - oder nls_-Ansichten zu überprüfen, sobald eine Verbindung hergestellt wurde die Datenbank."
Martin

0

Sie können Folgendes sehen :

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

Z.B:

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

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

1 row selected.

Ich denke, sys_context hier zu erwähnen ist nützlich. Andernfalls wird das Problem des Zeichensatzes nicht behoben .
Martin

Mein Punkt ist, dass dies die einzigen Dinge sind, die der Server kennt (oder interessiert).
Gaius
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.