Então, eu tenho poucos servidores Debian com o PostgreSQL. Historicamente, esses servidores e o PostgreSQL são localizados com o charset Latin 9 e, naquela época, tudo estava bem. Agora temos que lidar com coisas como polonês, grego ou chinês, para mudar isso se torna 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 algumas pesquisas sobre o assunto com meu antigo amigo Google, e tudo o que pude encontrar foram alguns procedimentos complicados, como atualizar o Debian LANG
, recompilar o PostgreSQL com o conjunto de caracteres correto, editar todas as LC_
variáveis do sistema e outras soluções obscuras. Por enquanto, deixamos essa questão de lado.
Recentemente, ele voltou novamente, os gregos querem o material e o Latin 9 não. E enquanto eu estava analisando esse problema novamente, um colega veio até mim e disse: "Não, é fácil, veja."
Ele não editou nada, não fez truques de mágica, 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 ao usar isso não nas primeiras soluções no Google e até 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 codificações diferentes em bancos de dados diferentes de um cluster é mais teórica do que real, exceto quando você seleciona a localidade C ou POSIX (desativando assim qualquer reconhecimento real da localidade).
Então isso me fez pensar: isso é fácil demais, perfeito demais, quais são as desvantagens? E ainda tenho dificuldade em encontrar uma resposta. Então aqui vou eu postar aqui:
tl; dr: Qual a desvantagem do uso LC_CTYPE='C'
em uma localização específica? É ruim fazer isso? O que devo esperar quebrar?