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?
fonte
collate "C"
depois doorder by
. Cabe a você determinar se e onde seu aplicativo precisa. A maioria dos aplicativos por aí realmente não se importa.COLLATE
especificador diferente do banco de dados.Em referência à resposta aceita por Daniel sobre a classificação usando agrupamentos, lembre-se de que, se você estiver executando o PostgreSQL em um Mac, o agrupamento preferido pode não funcionar conforme o esperado, devido a configurações inadequadas para alguns agrupamentos no nível do sistema operacional. Você pode ler mais sobre o problema aqui:
http://www.postgresql.org/message-id/[email protected]
Este não é um problema específico do PostgreSQL, especificamente, mas um problema com a configuração padrão do Mac para configurações de agrupamento. Meu sistema atual está executando o PostgreSQL 9.3 no OS X El Capitan versão 10.11 e sofre com esse problema. Meu sistema retorna os mesmos resultados da consulta, independentemente de eu usar o agrupamento "fr_FR" ou "en_US". Por exemplo:
Usando o agrupamento "fr_FR":
Usando o agrupamento "en_US":
No meu sistema, as configurações de agrupamento (no nível do sistema operacional) são as mesmas para "fr_FR" e "en_US", conforme demonstrado no shell, executando diff:
Esperamos que essas informações adicionais sejam úteis para quem estiver lendo isso e estiver usando o PostgreSQL em um Mac que sofre desse problema.
fonte