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 utilizado para inibir problemas.
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, vamos criar uma função em PostgreSQL em que remove os caracteres acentuados.
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)
Retorno: 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.

Funcionou !
Somente acrescentei alguns caracteres:
'áàâãäåaaaÁÂÃÄÅAAAÀéèêëeeeeeEEEÉEEÈìíîïìiiiÌÍÎÏÌIIIóôõöoooòÒÓÔÕÖOOOùúûüuuuuÙÚÛÜUUUUçÇñÑýÝ',
'aaaaaaaaaAAAAAAAAAeeeeeeeeeEEEEEEEiiiiiiiiIIIIIIIIooooooooOOOOOOOOuuuuuuuuUUUUUUUUcCnNyY'
Obrigado!
Att: Wagner Cipriano
Grande Wagner.
Atualizei a matéria com a sua sugestão, obrigado pela colaboração.
Abraços.
Funciona perfeitamente! Obrigado!
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?
é possível utilizando trigger
Muito útil, obrigado por compartilhar, abraços!!
Faltou o Ê
Segue minha contribuição com o máximo de caracteres que mapiei ate o momento:
‘åÅØÐßñÑýÝÀÁÃÄäãáàËÉÈÊêëéèÏÍÌÎîïíìÖÓÔôöóÒòÕõÙùÚúÜüÛûÇ窺°³²¹¬¢£³²¹§@#$%!¨&*()-+=[]{}^~´`?/:;,\|”_ÞÆŒ’
‘aAODBnNyYAAAAaaaaEEEEeeeeIIIIiiiiOOOoooOoOoUuUuUuUuCcaoo321’
@alisssoncardoso