sexta-feira, 20 de janeiro de 2012

Retirando acentuação no PostgreSQL

Papo SQL - PostgreSQL
Salve salve colegas, estou de volta após meus longos 15 dias de férias, e só tenho uma coisa a dizer, ficar afastado de tecnologia é um tédio.

Mas deixando de enrolação..., cotidianamente vejo tópicos em fóruns pela web a fora que discutem a questão dos caracteres especiais no banco de dados, inúmeras discussões sobre Charset e Collation a ser usados para inibir o problema.

Se bem pensado no início do desenvolvimento, a situação pode ser até fácil de se contornar, adotando medidas simples no momento de alimentar os dados, ou a forma de alimentar. Pensando em uma situação em que não podemos aceitar a inserção de caracteres acentuados em nosso banco de dados, apresento hoje uma função para ser utilizada como solução a situação.

Para isto utilizaremos a função Translate existente no PostgreSQL, que tem a seguinte especificação:

Tipo: Function (translate(string text, from text, to text)
Returno: Text
Exemplo: translate('12345', '14', 'ax')
Resultado: a23x5

No exemplo acima, retirado da documentação do PostgreSQL, temos a substituição dos numerais 1 e 4 pelos alfanuméricos a e x respectivamente, algo bem semelhante ao replace.

Mas deixando de enrolação, vamos a função para retirar a acentuação.

Atualizado em: 01/08/2015 - Sugestão do colega Wagner Ciprian.

 CREATE OR REPLACE FUNCTION retira_acentuacao(p_texto text)  
  RETURNS text AS  
 $BODY$  
 Select translate($1,  
 'áàâãäåaaaÁÂÃÄÅAAAÀéèêëeeeeeEEEÉEEÈìíîïìiiiÌÍÎÏÌIIIóôõöoooòÒÓÔÕÖOOOùúûüuuuuÙÚÛÜUUUUçÇñÑýÝ',  
 'aaaaaaaaaAAAAAAAAAeeeeeeeeeEEEEEEEiiiiiiiiIIIIIIIIooooooooOOOOOOOOuuuuuuuuUUUUUUUUcCnNyY'   
  );  
 $BODY$  
 LANGUAGE sql VOLATILE  
 COST 100;  

Com o uso do Translate, mapeei todos os caracteres acentuados que não devem ser aceitos, e para corrigi-los, especifiquei quais os caracteres deveriam substituí-los, simples assim.

Espero mais um vez ter sido útil a você, lembrando que sugestões de matérias, críticas ou elogios serão sempre bem vindos.

Abraços.

_ _
Fabiano Abreu

Clique aqui e veja todas as matérias sobre PostgreSQL

4 comentários:

  1. Funcionou !
    Somente acrescentei alguns caracteres:

    'áàâãäåaaaÁÂÃÄÅAAAÀéèêëeeeeeEEEÉEEÈìíîïìiiiÌÍÎÏÌIIIóôõöoooòÒÓÔÕÖOOOùúûüuuuuÙÚÛÜUUUUçÇñÑýÝ',
    'aaaaaaaaaAAAAAAAAAeeeeeeeeeEEEEEEEiiiiiiiiIIIIIIIIooooooooOOOOOOOOuuuuuuuuUUUUUUUUcCnNyY'

    Obrigado!

    Att: Wagner Cipriano

    ResponderExcluir
    Respostas
    1. Grande Wagner.

      Atualizei a matéria com a sua sugestão, obrigado pela colaboração.

      Abraços.

      Excluir
  2. Bom dia, é possivel utilizar uma function no postgresql para que ao inserir uma nova linha, em qualquer tabela que seja, a function já altere a string, removendo acentos e colocando tudo em upper case para que seja salvo no banco? isso tanto no insert quanto no update. Tenho uma aplicação para dar manutenção, tem mais de 120 tabelas, as consultas utilizam hibernate e os caracteres acentuados não são localizados, em vez de sair mexendo todo o código do sistema (imenso) ajustando para quando salvar tratar a string, eu gostaria de fazer isso no banco, é possível?Alguma ajuda?

    ResponderExcluir