Ordenaciones en castellano en Oracle

Probad a crear una tabla como esta con unos datos de prueba

CREATE TABLE TEST_ACENTOS

(

MES VARCHAR2(50 BYTE)

)

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘ENBBB’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘ENERO ‘);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘ENaaa’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘Enero’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘JUNIO’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘MAYO’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘Mayo’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘eNZZZ’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘enAAA’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘enaaa’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘enbbb’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘enero’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘junio’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘mayo’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘ÉNERO’);

INSERT INTO TEST_ACENTOS ( MES ) VALUES (

‘énero’);

Y a hacer esta SELECT:

SELECT * FROM TEST_ACENTOS order by mes

Qué os devuelve?…

Os debería devolver esto:

Si no lo hace es que no tenéis bien configurados los parámetros de Oracle y tarde o temprano alguien se quejará J

Podéis ver los parámetros con: select * from nls_session_parameters where parameter in (‘NLS_SORT’,’NLS_COMP’);

El NLS_SORT debe ser SPANISH y el NLS_COMP BINARY deben ser:

Los podéis actualizar con el comando: alter session set nls_sort=binary;

Respuestas

  1. Avatar de Antonio Gonzalez Jimenez
    Antonio Gonzalez Jimenez

    … un par de anotaciones para que nadie se lance.

    En el proyecto de la RFEF llevamos mas de 2 años trabajando con la version 11 de Oracle, y tengo que decir que el soporte de lenguaje que comenta Luismi da bastante guerra.

    En concreto estamos trabajado con los parámetros…

    NLS_COMP = LINGUISTIC’;

    NLS_SORT = XSPANISH_AI’;

    … que van un poco mas allá de lo que comentaba Luismi, pero seguro que si en algún proyecto os han pedido que “Oracle ordene bien”… se refieren a esto.

    Con esta parametrización conseguimos:

    – Case insensitive. En busquedas (incluyendo acentos). Es decir da igual buscar José que jose

    – Ordenación lingüística en castellano. Teniendo en cuenta el lugar correto de la ñ

    Por mi experiencia deciros que si no lo necesitáis expresamente no lo utilicéis.

    – Penaliza el rendimiento

    – En general necesitara configuración a nivel de sesión de Oracle (nosotros tenemos un trigger que fuerza la parametrización en el login de la base de datos en función del usurio, no hemos conseguido cambiar setear la configuración a nivel global para toda la base de datos )

    – Los indices en campos de texto (varchar) necesitan crearse con funciones para usar estas funcionalidades

    (ejem CREATE INDEX squema.indexname ON squema.tabla (NLSSORT(«column»,’nls_sort=»XSPANISH_AI»’))

    Antonio González Jiménez
    Soluciones Tecnológicas – Arquitectura y Plataformas

    ——————————————————————————–

    De: «Prieto Arribas, José Ignacio» [mailto:jiprieto@indra.es]
    Enviado el: jueves, 21 de enero de 2010 0:32
    Para: ayp-arquitecturajava@egrupos.net
    Asunto: RE: [ayp-arquitecturajava] Ordenaciones en castellano en Oracle

    Sí, pero sólo a partir de la versión 10G r2 (la r1 no). Les ha costado a los de Oracle reconocer que hay otros idiomas aparte del inglés.

  2. En esta web vienen bastantes ejemplos, parece que el bueno en nuestro caso sería el BINARY_AI que ordenaría
    á,a,A,z

    http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#NLSPG005

Deja un comentario