DEV Community

Valter Zanchetti Filho
Valter Zanchetti Filho

Posted on

Desconsiderando maiúsculas, minúsculas e acentos com collations no Oracle

Às vezes, precisamos fazer comparações no Oracle nas quais queremos desconsiderar se o texto está em maiúsculas, minúsculas ou se contém acentos. Para isso, existe uma solução chamada COLLATE, que pode ser utilizada a nível de tabela, sessão ou diretamente na query. Neste artigo, trataremos das collations aplicadas a nível de query.

Exemplo prático:

Você precisa consultar uma pessoa na base de dados chamada José, porém, no banco de dados ela está registrada como Jose — ou vice-versa. Nesse caso, a comparação padrão seria:

SELECT * FROM DUAL WHERE 'JOSÉ' = 'JOSE';
Enter fullscreen mode Exit fullscreen mode

Resultado: nenhuma linha selecionada

Isso acontece porque, no padrão do banco de dados Oracle, 'JOSÉ' não é igual a 'JOSE'. No entanto, se utilizarmos uma collation específica, o Oracle poderá desconsiderar os acentos no momento da comparação.

Veja este exemplo:

SELECT * FROM DUAL WHERE 'JOSÉ' COLLATE BINARY_AI = 'JOSE'; 
SELECT * FROM DUAL WHERE 'JOSÉ' COLLATE BINARY_AI = 'Jose';
Enter fullscreen mode Exit fullscreen mode

Se executarmos essas queries, obteremos uma linha de resultado para cada uma. Por quê?

Quando utilizamos o COLLATE BINARY_CI ou BINARY_AI, estamos informando ao banco que ele deve considerar os textos da seguinte forma:

  • _CI (Case Insensitive): Ignora diferenças entre maiúsculas e minúsculas, mas considera acentos.

  • _AI (Accent Insensitive): Ignora acentos, maiúsculas e minúsculas.

Simples e prático!

Você também pode definir uma collation a nível de tabela ou até mesmo de coluna, permitindo que todas as queries feitas sobre esse dado ignorem automaticamente as diferenças de acentuação e CASE.

Fontes:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/nlspg/linguistic-sorting-and-matching.html#GUID-68633595-DC95-4393-A6B8-146AD05F5FDF

https://binovarghese.com/notes/2022/10/column-level-collation-and-case-insensitive-database-in-oracle/

Top comments (0)