De Inicialización de parámetros en Oracle o cómo solucionar problemas de localización y juegos de caracteres en el cliente de Oracle.

Cuando se está trabajando con una base de datos en Oracle suele asumirse de manera erronea que al establecer las opciones de idioma y codificación de caracteres en el servidor los datos serán entregados íntegramente al cliente y por consecuencia a las aplicaciones, pero en realidad Oracle considera un caso que suele escapar de nosotros: la globalización. Imaginemos un escenario en el que tenemos una base de datos con datos de nuestros clientes en México y en China, ahora imaginemos que por algún motivo uno de nuestros clientes en China necesita ver el nombre de uno de nuestros clientes en México. Esto podría repesentar un problema si el juego de caracteres presente en el entorno de nuestro cliente chino no contiene caracteres acentuados haciendo que el apellido "Guzmán" se mueste como "Gusm?n".

En una situación así tendríamos el programador tendría que gastar una cantidad considerable de tiempo haciendo que cada aplicación haga una conversión al juego de caracteres de cada dato que se muestra, pero afortunadamente Oracle nos ofrece una forma de lidiar con situaciones como esta: los parámetros NLS.

Los parámetros NLS (National Language Support) son una serie de parámetros que le dicen al cliente o al servidor de oracle si debe realizar alguna conversión para localizar los datos almacenados en nuestra base de datos antes de entregarlos a las aplicaciones. Haciendo una sobre simplificación de como ocurre este proceso:

  1. sabemos que los datos están almacenados con cierto formato y codificación.
  2. Al hacer una consulta los datos son extraidos y se verifica si se ha establecido algún parametro NLS en el servidor diferente al que se usó para crear nuestra base de datos. En caso de que se encuentre una diferencia, el servidor de Oracle hace una conversión de formato o codificación.
  3. Cuando los datos son entregados al cliente de Oracle, se verifica si existe alguna diferencia entre los parámetros NLS usados por el servidor y los que han sido especificados en el cliente. Si es el caso, entonces el cliente de Oracle hace una conversion de formato o codificación.

Oracle ofrece multiples parámetros NLS en el supuesto caso de que necesitemos confgurar la localización de forma muy específica, pero en la mayoria de los casos únicamente es necesario establecer el parámetro NLS_LANG, el cual sirve para indicar a Oracle el idioma, la región geográfica y el juego de caracteres en el que necesitamos los datos en un único parámetro.

El parámetro NLS_LANG tiene tres componentes: idioma, territorio y juego de caracteres los cuales deben ser expresados con el formato [Idioma]_[Territorio].[JuegoDeCaracteres], por ejemplo:

NLS_LANG = MEXICAN SPANISH_MEXICO.WE8MSWIN1252

Es posible omitir alguno de los components del parámetro, sin embargo es necesario conservar los caracteres de separación que preceden a cada uno de los componentes del valor. Por lo que si se desea especificar únicamente el juego de caracteres se usaría una variable tipo:

NLS_LANG = .WE8MSWIN1252

Cuando asignamos un valor al parámetro NLS_LANG es importante tener en cuenta que cada idioma tiene asignada una región y cada región tiene asignado un juego de caracteres. Por lo que si encontramos una variable con el valor:

NLS_LANG = MEXICAN SPANISH

Será lo mismo que tener:

NLS_LANG = MEXICAN SPANISH_MEXICO.WE8MSWIN1252

Asignando un valor al parámetro NLS_LANG.

El cliente de Oracle puede obtener el valor para la variable NLS_LANG de diversas formas según el contexto en el que se ejecute. A continuación describo cada uno de los escenarios con los que me he encontrado y cual es el comportamiento del cliente de Oracle para cada caso.

1. No se ha declarado el parámentro NLS_LANG

Cuando no se especifica el parámetro NLS_LANG, el cliente de Oracle asigna valores por defecto a cada uno de los parámetros NLS, siendo American_America.US7ASCII el valor asignado a NLS_LANG.

2. Entrada en el registro de Windows

Si nuestra aplicación se integra con el entorno de Windows, el cliente de oracle obtiene el valor para el parámentro NLS_LANG desde una entrada en el registro de windows. Esta entrada la podemos encontrar bajo HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE[HOMEID]\NLS_LANG donde HOMEID es el identificador de nuestra instalación del cliente de oracle

3. Parámetros establecidos como una variable de entorno.

Cuando nuestra aplicación no se integra con el entorno de Windows, el cliente de oracle recurre a una variable de entorno del sistema operativo. Esta variable debe responder al nombre NLS_LANG y su valor debe respetar el formato para el valor del parámetro.

4. Parámetro establecido para una sesión.

Suponiendo que sea necesario cambiar el valor del parametro NLS_LANG para una única sesión (incluso después de habernos conectado y realizado consultas), es posible modificar su valor para la sesión actual usando una sentencia ALTER SESSION

ALTER SESSION SET NLS_LANG = 'MEXICAN SPANISH_MEXICO.WE8MSWIN1252';

Es posible usar sentencias ALTER SESSION para modificar cualquier parametro NLS.

5. Indicado explícitamente en las funciones SQL.

Si se presenta una situación en la que sea necesario aplicar una opción de localización diferente a un campo único de nuestra consulta, es posible especificar un parámetro NLS exclusivamente a un campo haciendo una conversión explicita en nuestra consulta.

TO_CHAR(fecha, 'DD/MON/YYYY', 'nls_date_language = SPANISH')

Información adicional.

Si deseas aprender mas sobre los parámetros NLS recomiendo visitar los siguientes enlaces: