Database
Problemas de charset com as funções upper() e lower() do PostgreSQL
RT.DB.FAQ-43555
A forma com que o PostgreSQL trata a ordenação dos caractéres e a sua conversão para maiúsculo ou minúsculo depende o LC_COLLATE em uso.
Para verificar se o COLLATE está errado, executar os comandos abaixos:
Collate OK:
> select upper('ação');
AÇÂO
Collate ERRADO:
> select upper('ação');
AçãO
O encoding estabelece o charset utilizado. O collate estabelece a forma com que os caractéres são tratados (order by, comparação de valores, upper, lower, etc).
O collate "C" u "POSIX" acaba se utilizando de funções do sistema operacional e consequentemente, o idioma acaba influenciando.
O operador COLLATE do postgreSQL permite adotar um collate diferente nas operações. Exemplo:
> select upper('ação' collate "pt_BR");
AÇÃO
A saída encontrada, foi alterar o collate das colunas onde ocorre o problema:
alter table TABELA_X
alter column COLUNA_Y
type text collate "pt_BR";
Mais testes poderiam ser feitos para forçar o LC_COLLATE na carga do serviço.