Menentukan rangkaian karakter klien sesi Oracle?

9

Saya tahu bagaimana rangkaian karakter database ( NLS_CHARACTERSETdalam select * from v$nls_parameters;) dan karakter klien (pengaturan lingkungan klien NLS_LANG) berinteraksi.

Apa yang saya tidak dapat mengetahuinya, adalah bagaimana atau jika saya dapat menentukan, untuk sesi yang ditetapkan , apa yang dipikirkan Oracle tentang karakter klien saat ini.

Apakah ini mungkin?

Catatan: SELECT * FROM NLS_SESSION_PARAMETERS;tidak tidak termasuk karakter set (atas 10g2).

Untuk memperjelas apa yang ingin saya capai:

  1. NLS_LANG diatur dalam lingkungan klien ke nilai arbitrer (misalnya GERMAN_GERMANY.WE8MSWIN1252)
  2. Aplikasi basis data [*] memulai dan membuat koneksi / sesi ke basis data Oracle.
  3. Aplikasi basis data [*] ingin "bertanya" Oracle (bukan lingkungan OS-nya) apa yang akan diasumsikan oleh karakter klien.

[*]: Jika aplikasi db adalah sqlplus, contohnya akan terlihat sebagai berikut:

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

Catatan Jack dalam jawabannya memunculkan dua poin penting:

  • Dengan Oracle, siapa yang melakukan terjemahan characteret. Apakah itu kode pustaka klien atau dilakukan di sisi server?
  • Karena tampaknya itu adalah klien, klien akan perlu memaparkan pengaturan ini - apa yang diasumsikan oleh klien lib / alat pengaturan ini. Apakah ada libs / alat klien Oracle (sqlplus, OCI / OCCI, Pro * C, ...) yang dapat ditanyakan tentang apa yang dianggap pengaturan ini?
Martin
sumber

Jawaban:

9

Saya agak ragu apakah ini yang sebenarnya Anda cari, tetapi

host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

memperlihatkan variabel lingkungan nls_lang klien pada klien.

Saya tidak berpikir akan ada query SQL yang dapat Anda jalankan untuk memberikan pengaturan 'saat ini' karena AFAIK server tidak menyadari terjemahan apa yang dilakukan sisi klien, jadi setiap perintah untuk menunjukkan pengaturan saat ini harus asli ke klien - Saya menggunakan SQL Developer untuk perintah di atas, tetapi saya menganggap itu akan bekerja sama di SQL * Plus

--edit

dari AskTom :

hanya klien yang tahu set karakter mereka juga - itu tidak tersedia "dalam database"

dan

set karakter menjelaskan apa yang disimpan dalam database.

klien membuat terjemahan yang diinginkan ke karakter [sic] ke database melalui settling NLS_LANG.

Jika Anda menggunakan 11.1+, Anda mungkin bersenang-senang dengan v $ session_connect_info, karena:

Informasi ini didorong oleh OCI ke server pada saat masuk.

Tapi saya menemukan itu masih akan tergantung pada bagaimana Anda menghubungkan, mis. Dari JDBC Thin Driver Anda tidak menggunakan OCI dan informasi tersebut tidak didorong

Jack mengatakan coba topanswers.xyz
sumber
Ya, tidak, itu sebenarnya bukan yang saya cari :-) - Tapi Anda menaikkan satu (dua) poin penting, dan jika itu benar, saya kira itu akan menjadi jawaban yang dapat diterima. Saya akan menambahkan dua poin ke pertanyaan.
Martin
Bah! (tidak menyalahkan Anda) Tapi Oracle benar-benar memilikinya: "hanya klien yang tahu set karakter mereka juga - itu tidak tersedia" dalam database " " dan "klien membuat ... diketahui ke database melalui NLS_LANG" adalah benar-benar menyatakan sebaliknya, bukan? :-)
Martin
Ya Anda benar meskipun Tom <> Oracle. Saya pikir dia tersandung oleh kata-katanya - seluruh utas itu layak dibaca ...
Jack mengatakan coba topanswers.xyz
1
Jawaban yang diterima untuk tautan 1 - karena pertanyaan pada Tanya Tom ini (dari 2002) sebenarnya menanyakan hal yang sama "Saya ingin tahu apakah mungkin untuk memeriksa pengaturan NLS_LANG sisi klien di salah satu dari $ v atau nls_ tampilan yang pernah terhubung ke data."
Martin
0

Anda dapat melihat yang berikut ini :

  • NLS_CALENDAR
  • NLS_CURRENCY
  • NLS_DATE_FORMAT
  • NLS_DATE)
  • NLS_SORT
  • NLS_TERRITORY

Misalnya:

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

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

1 row selected.
Gayus
sumber
Saya kira menyebutkan sys_context di sini berguna. Kalau tidak, ini gagal untuk mengatasi masalah yang set karakter .
Martin
Maksud saya adalah ini adalah satu-satunya hal yang diketahui (atau peduli) oleh server.
Gayus