Determinar el conjunto de caracteres del cliente de sesión de Oracle?

9

Yo cómo el juego de caracteres de base de datos ( NLS_CHARACTERSETen select * from v$nls_parameters;) y el conjunto de caracteres del cliente (el valor del entorno de cliente NLS_LANG) interactúan.

Sin embargo, lo que no puedo descubrir es cómo o si puedo determinar, para una sesión establecida , qué Oracle cree que es el conjunto de caracteres del cliente actual.

¿Es esto posible en absoluto?

Nota: SELECT * FROM NLS_SESSION_PARAMETERS;no no incluir el juego de caracteres (en 10G2).

Para dejar absolutamente claro lo que me gustaría lograr:

  1. NLS_LANG se establece en el entorno del cliente en un valor arbitrario (por ejemplo GERMAN_GERMANY.WE8MSWIN1252)
  2. La aplicación de base de datos [*] se inicia y establece una conexión / sesión con la base de datos Oracle.
  3. La aplicación de base de datos [*] quiere "preguntar" a Oracle (no a su entorno de sistema operativo) qué asumirá el conjunto de caracteres del cliente.

[*]: Si la aplicación db es sqlplus, el ejemplo sería el siguiente:

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

La nota de Jack en su respuesta plantea dos puntos importantes:

  • Con Oracle, quien hace la traducción del juego de caracteres. ¿Es el código de la biblioteca del cliente o se realiza en el lado del servidor?
  • Como parece que es el cliente, el cliente necesitaría exponer esta configuración, lo que la biblioteca / herramienta del cliente supone que es esta configuración. ¿Hay alguna de las bibliotecas / herramientas del cliente Oracle (sqlplus, OCI / OCCI, Pro * C, ...) que se puede consultar para saber qué cree que es esta configuración?
Martín
fuente

Respuestas:

9

Dudo un poco que esto sea exactamente lo que estás buscando, pero

host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

muestra la variable de entorno del cliente nls_lang en el cliente.

No creo que haya una consulta SQL que pueda ejecutar para dar la configuración 'actual' porque AFAIK el servidor no sabe qué traducción se realiza en el lado del cliente, por lo que cualquier comando para mostrar la configuración actual tendrá que ser nativo para el cliente: utilicé SQL Developer para el comando anterior, pero supongo que funcionará igual en SQL * Plus

--editar

de AskTom :

solo el cliente conoce su conjunto de caracteres también: no está disponible "en la base de datos"

y

el juego de caracteres describe lo que se almacena en la base de datos.

el cliente hace su traducción deseada al carácter conocido [sic] a la base de datos a través de la configuración NLS_LANG.

Si estaba en 11.1+, podría tener algo de alegría con v $ session_connect_info, porque:

OCI envía esta información al servidor en el momento de inicio de sesión.

Pero descubrí que aún dependería de cómo se esté conectando, por ejemplo, desde el controlador delgado JDBC no está utilizando OCI y, por lo tanto, la información no se envía

Jack dice que intente topanswers.xyz
fuente
Bueno, no, no es exactamente lo que estaba buscando :-) - Pero usted plantea un (dos) punto (s) importante, y si es cierto, supongo que sería una respuesta aceptable. Agregaré los dos puntos a la pregunta.
Martin
¡Bah! (no te culpo) Pero Oracle realmente lo tiene: "solo el cliente conoce su conjunto de caracteres también; no está disponible" en la base de datos " " y "el cliente hace saber a la base de datos a través de NLS_LANG" realmente diciendo lo contrario, ¿no? :-)
Martin
Sí, tienes razón aunque Tom <> Oracle. Creo que está tropezando con sus palabras - que el hilo entero está bien vale la pena desnatado ...
Jack dice intento topanswers.xyz
1
Respuesta aceptada para el primer enlace : porque esta pregunta en Ask Tom (desde 2002) realmente pregunta lo mismo "Me gustaría saber si es posible verificar la configuración NLS_LANG del lado del cliente en cualquiera de las vistas v $ o nls_ una vez conectado la base de datos."
Martin
0

Puedes ver lo siguiente :

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

P.ej:

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

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

1 row selected.
Gayo
fuente
Supongo que mencionar sys_context aquí es útil. De lo contrario, esto no resuelve el problema de qué juego de caracteres .
Martin
Mi punto es que estas son las únicas cosas que el servidor sabe (o le importa).
Cayo el