it-swarm.asia

Menentukan rangkaian karakter klien sesi Oracle?

Saya tah bagaimana set karakter basis data (NLS_CHARACTERSET di select * from v$nls_parameters;) dan set karakter klien (pengaturan lingkungan klien NLS_LANG) berinteraksi.

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

Apakah ini memungkinkan?

Catatan: SELECT * FROM NLS_SESSION_PARAMETERS; tidak tidak menyertakan set karakter (pada 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) yang akan diasumsikan oleh karakter klien.

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

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

Catatan Jack dalam jawabannya memunculkan dua poin penting:

  • Dengan Oracle, siapa melakukan terjemahan characteret. Apakah itu kode pustaka klien atau dilakukan di sisi server?
  • Seperti yang terlihat itu adalah klien, klien perlu mengekspos 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?
9
Martin

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, tapi 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 memiliki kesenangan 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

Anda dapat melihat 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.
0
Gaius