2011-07-13 21 views
5

Nuestro Oracle DB es UTF8. Estamos almacenando direcciones que necesitan ser buscadas. Algunos de los nombres de las calles contienen caracteres no ingleses (por ejemplo, Peña Báináõ), debe poder buscarse como "Peña Báináõ" o con caracteres equivalentes en inglés como "Pena Bainao". Lo que hicimos es convertir el texto en la consulta, algo así como:Texto de búsqueda de Oracle con caracteres no ingleses

SELECT CONVERT('Peña Báináõ','US7ASCII') as converted FROM dual; 

Pero la cuestión aquí es que no todos los personajes tienen un equivalente Inglés (no incluso algunos bastante obvios, como N u O) por lo nos encontramos con el texto convertido en:

Pe?a Baina? 

lo tanto, si el usuario intenta encontrar que addres escribir "Pena Bainao" no puede encontrarlo porque "Pena Bainao" es diferente de "" Pe? A Baina? "".

Hemos descubierto algunos trabajos sucios en esto, pero quería comprobar primero si alguien ha encontrado una solución más elegante.

Aquí está una lista de algunos personajes que no se convierten a US7ASCII:

Character  UTF8 Code  Possible Equivalent 
æ   - u00E6  -  ae 
å   - u00E5  -  a 
ã   - u00E3  -  a 
ñ   - u00F1  -  n 
õ   - u00F5  -  o 

Respuesta

5

1) Usando nlssort con BINARY_AI (Ambos caso y acento insentive):

SQL> select nlssort('Peña Báináõ', 'NLS_SORT = BINARY_AI') C from dual; 

C 
------------------------ 
70656E61206261696E616F00 

SQL> select nlssort('Pena Bainao', 'NLS_SORT = BINARY_AI') C from dual; 

C 
------------------------ 
70656E61206261696E616F00 

SQL> select nlssort('pena bainao', 'NLS_SORT = BINARY_AI') C from dual; 

C 
------------------------ 
70656E61206261696E616F00 

SQL> select 'true' T from dual where nlssort('pena bainao', 'NLS_SORT = BINARY_AI') = nlssort('Peña Báináõ', 'NLS_SORT = BINARY_AI') ; 

T 
---- 
true 

2) Usted podría también alterar la variable de sesión NLS_SORT a binary_ai y luego no tendría que especificar NLS_SORT cada vez:

SQL> select 'true' T from dual where nlssort('pena bainao') = nlssort('Peña Báináõ') ; 

no rows selected 

SQL> alter session set nls_sort = binary_ai; 

Session altered. 

SQL> select 'true' T from dual where nlssort('pena bainao') = nlssort('Peña Báináõ') ; 

T 
---- 
true 

3) Para disminuir el uso de nlssort función y cambiar los sematics de todo, también establecer la variable de sesión nls_comp:

SQL> select 'true' T from dual where 'pena bainao' = 'Peña Báináõ'; 

no rows selected 

SQL> alter session set nls_comp = linguistic; 

Session altered. 

SQL> select 'true' T from dual where 'pena bainao' = 'Peña Báináõ'; 

T 
---- 
true 

Opción solo 1 cambia los comportamientos locales, la consulta en la que desea resultados diferentes. Las opciones 2 y 3 cambiarán el comportamiento de otras consultas y es posible que no sea lo que desea. Ver Table 5-2 de Oracle® Database Globalization Support Guide. Consulte también la sección "Using Linguistic Indexes" para ver cómo se pueden usar los índices.

+0

también consideran SOUNDEX y otras funciones basadas en la similitud. – Randy

+2

'soundex ('Pena Bainao')' yeilds P515, 'soundex ('Peña Báináõ')' yeilds P150. Los parámetros de sesión NLS_SORT y NLS_COMP no afectan los resultados. –

+0

@Shannon Severance: genial, ALTER SESSION SET NLS_COMP = LINGUISTIC y ALTER SESSION SET NLS_SORT = BINARY_AI no hizo el truco, pero redujo significativamente la complejidad de la consulta. ¡Muchas gracias! – Chepech

Cuestiones relacionadas