AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 46408
Accepted
Tae
Tae
Asked: 2013-07-16 15:58:58 +0800 CST2013-07-16 15:58:58 +0800 CST 2013-07-16 15:58:58 +0800 CST

Como escolher um agrupamento para banco de dados internacional?

  • 772

Estou projetando um banco de dados que armazenará dados em diferentes idiomas (usando UTF-8), então acho que a melhor maneira de exibir os resultados da consulta é ordenando-os de acordo com o idioma do usuário durante a própria consulta ( porque há mais de um maneiras corretas de fazer isso ), como segue:

SELECT a < b COLLATE "de_DE" FROM test1;

Supondo que esta seja a maneira correta de trabalhar com dados internacionais, qual é o melhor agrupamento para o próprio banco de dados? A documentação do PostgreSQL diz :

Os agrupamentos C e POSIX especificam o comportamento "C tradicional", no qual apenas as letras ASCII "A" a "Z" são tratadas como letras e a classificação é feita estritamente por valores de byte de código de caractere.

Acho que esta é a melhor escolha neste caso, ou estou errado?

(Pergunta bônus: é muito lento selecionar o agrupamento na própria consulta?).

database-design postgresql
  • 3 3 respostas
  • 23443 Views

3 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2013-07-16T18:31:36+08:002013-07-16T18:31:36+08:00

    O Cagrupamento é a escolha certa.

    Tudo é um pouco mais rápido sem localidade. E como nenhum agrupamento está certo de qualquer maneira, crie o banco de dados sem agrupamento, ou seja, com C.

    Pode ser difícil ter que fornecer um agrupamento para muitas operações. No entanto, não deve haver uma diferença perceptível na velocidade entre o agrupamento padrão e um agrupamento ad-hoc. Afinal, são apenas dados não classificados e as regras de agrupamento são aplicadas durante a classificação.

    Esteja ciente de que o Postgres se baseia nas configurações de localidade fornecidas pelo sistema operacional subjacente, portanto, você precisa ter localidades geradas para cada localidade a ser usada. Mais em resposta relacionada em SO aqui e aqui .

    No entanto, como o @Craig já mencionou , os índices são o gargalo nesse cenário. O agrupamento do índice deve corresponder ao agrupamento do operador aplicado em muitos casos que envolvem dados de caractere.

    Você pode usar o COLLATEespecificador em índices para produzir índices correspondentes. Índices parciais podem ser a escolha perfeita se você estiver misturando dados na mesma tabela.

    Por exemplo, uma tabela com strings internacionais:

    CREATE TABLE string (
       string_id serial
      ,lang_id   int NOT NULL
      ,string    text NOT NULL
    );
    

    E você está interessado principalmente em um idioma por vez:

    SELECT *
    FROM   string
    WHERE  lang_id = 5  -- 5 being German / Germany here
    AND    string > 'foo' COLLATE "de_DE"
    ORDER  BY string COLLATE "de_DE";
    

    Em seguida, crie índices parciais como:

    CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
    WHERE lang_id = 5;
    

    Um para cada idioma que você precisa.

    Na verdade, a herança pode ser uma abordagem superior para uma tabela como esta. Então você pode ter um índice simples em cada tabela herdada contendo apenas strings para uma única localidade. Você precisa estar confortável com as regras especiais para tabelas herdadas, é claro.

    • 32
  2. Peter Eisentraut
    2013-07-17T08:52:27+08:002013-07-17T08:52:27+08:00

    Sugiro que você escolha um agrupamento que forneça a ordem Unicode padrão. Dessa forma, você obtém resultados sensatos, mesmo que não substitua o agrupamento em cada consulta. Infelizmente, a maioria (todos?) Os sistemas operacionais não fornecem uma localidade que é simplesmente chamada de "Unicode padrão" ou algo assim, então você terá que adivinhar e/ou pesquisar uma boa escolha. Por exemplo, no Linux/glibc, as localidades de_DE.utf8 ou en_US.utf8 simplesmente passam pelo comportamento padrão, então ambas são boas escolhas.

    Não acho que usar a localidade C seja uma boa ideia, porque o comportamento padrão do seu aplicativo será inútil. E você pode não obter o comportamento adequado das operações de conversão de maiúsculas e minúsculas.

    (Substituir o agrupamento em uma consulta não tem muita sobrecarga. É apenas uma operação de tempo de análise.)

    • 14
  3. TmTron
    2019-11-03T23:56:28+08:002019-11-03T23:56:28+08:00

    Usamos o postgres em um container docker, assim sempre temos o ICU disponível e usamos und-x-icucomo padrão.

    Isso é mencionado no capítulo 23.2.2.2.2. Os agrupamentos de UTI dos documentos postres mencionam:

    und-x-icu (para “indefinido”)
    ICU agrupamento “raiz”. Use isso para obter uma ordem de classificação independente de idioma razoável.

    • 1

relate perguntas

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve