Corrigindo erros de ordenação

<< Click to Display Table of Contents >>

Navigation:  PostgreSQL > Avançado >

Corrigindo erros de ordenação

Previous pageReturn to chapter overviewNext page

Problema

Você descobriu ao fazer um select num servidor em linux que a ordenação tá meio estanha:

select nome from tabela order by nome

 

NOME

----------------------------------

GABRIELA HELEDA DE SOUZA

GABRIELA JACOBY NOS

GÁBRIELA JACOBY NOS

GABRIEL ALCIDES KLIM PERONDI

GÁBRIEL ALCIDES KLIM PERONDI

GABRIELA LETICIA BATISTA NUNES

GABRIEL ALEXANDRE DA SILVA MANICA
 

Reparou que as "GABRIELAS" estão antes do GABRIEL?

Já tinha reparado este bug?

Motivo

O motivo do bug nem é culpa do PG.

A questão é na glibc do Linux e da ordenação.

Descobri que esse 'bug' dos espaços acontece em vários idiomas, não só no nosso.

 

Correção

Para corrigir você precisa rodar um shell-script como root conforme abaixo:


corrigir-locale-ptbr.sh

cd /usr/share/i18n/locales/

 

NOMES=/tmp/nomes.txt

cat > $NOMES << EOF

GABRIELA HELEDA DE SOUZA

GABRIELA JACOBY NOS

GÁBRIELA JACOBY NOS

GABRIEL ALCIDES KLIM PERONDI

GÁBRIEL ALCIDES KLIM PERONDI

GABRIELA LETICIA BATISTA NUNES

GABRIEL ALEXANDRE DA SILVA MANICA

EOF

 

export LC_ALL=pt_BR

 

echo "1) ANTES:"

sort $NOMES

 

if [ ! -f pt_BR.old ]

then

  cp pt_BR pt_BR.old

  sed 's/copy "iso14651_t1"/copy "iso14651_t1"\nreorder-after <U00A0>\n<U0020><CAP>;<CAP>;<CAP>;<U0020>\nreorder-end/' pt_BR.old > pt_BR

  localedef -i pt_BR -c -f ISO-8859-1 -A /usr/share/locale/locale.alias pt_BR

  localedef -i pt_BR -c -f UTF-8 -A /usr/share/locale/locale.alias pt_BR.UTF-8

fi

 

echo "2) DEPOIS:"

sort $NOMES

 


Observação

É necessário reiniciar o serviço do PostgreSQL após rodar esse shell-script

para fazer isso veja esta dica: Reiniciar o serviço do Postgresql