Então, eu tenho poucos servidores Debian com PostgreSQL nele. Historicamente, esses servidores e o PostgreSQL são localizados com o conjunto de caracteres Latin 9 e naquela época estava tudo bem. Agora temos que lidar com coisas como polonês, grego ou chinês, então mudá-lo se tornou um problema crescente.
Quando tentei criar um banco de dados UTF8, recebi a mensagem:
ERRO: a codificação UTF8 não corresponde à localidade fr_FR Detalhe: A configuração LC_CTYPE escolhida requer a codificação LATIN9.
Poucas vezes fiz uma pesquisa sobre o assunto com meu velho amigo Google, e tudo que encontrei foram alguns procedimentos supercomplicados como atualizar o Debian LANG
, recompilar o PostgreSQL com o charset correto, editar todas as LC_
variáveis do sistema e outras soluções obscuras. Então, por enquanto, deixamos essa questão de lado.
Recentemente, voltou novamente, os gregos querem as coisas e o latim 9 não quer. E enquanto eu estava analisando essa questão novamente, um colega veio até mim e disse: “Não, é fácil, olhe”.
Ele não editou nada, não fez truques de mágica, ele apenas fez esta consulta SQL:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
E funcionou bem.
Na verdade, eu não sabia LC_CTYPE='C'
e fiquei surpreso que usar isso não estivesse nas primeiras soluções do Google e até mesmo no Stack Overflow. Olhei em volta e só encontrei uma menção na documentação do PostgreSQL.
Quando LC_CTYPE é C ou POSIX, qualquer conjunto de caracteres é permitido, mas para outras configurações de LC_CTYPE existe apenas um conjunto de caracteres que funcionará corretamente. Como a configuração LC_CTYPE é congelada pelo initdb, a aparente flexibilidade para usar diferentes codificações em diferentes bancos de dados de um cluster é mais teórica do que real, exceto quando você seleciona a localidade C ou POSIX (desativando assim qualquer reconhecimento de localidade real).
Então isso me fez pensar, isso é muito fácil, muito perfeito, quais são as desvantagens? E eu tenho dificuldade em encontrar uma resposta ainda. Então vou postar aqui:
tl; dr: Quais são as desvantagens de usar LC_CTYPE='C'
em uma localização específica? É ruim fazer isso? O que devo esperar para quebrar?