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.