mysql verificar Qual é a diferença entre utf8_general_ci e utf8_unicode_ci




verificar charset mysql (5)

Entre utf8_general_ci e utf8_unicode_ci , existem diferenças em termos de desempenho?


Este post descreve muito bem.

Em suma: utf8_unicode_ci usa o algoritmo de agrupamento Unicode, conforme definido nos padrões Unicode, enquanto utf8_general_ci é uma ordem de classificação mais simples que resulta em resultados de classificação "menos precisos".


Esses dois agrupamentos são para a codificação de caracteres UTF-8. As diferenças estão em como o texto é classificado e comparado.

Nota: Desde o MySQL 5.5.3 você deve usar utf8mb4 vez de utf8 . Ambos se referem à codificação UTF-8, mas o utf8 mais antigo tinha uma limitação específica do MySQL, impedindo o uso de caracteres numerados acima de 0xFFFD.

  • Precisão

    utf8mb4_unicode_ci é baseado no padrão Unicode para classificação e comparação, que classifica com precisão em uma ampla variedade de idiomas.

    utf8mb4_general_ci falha ao implementar todas as regras de ordenação Unicode, o que resultará em ordenação indesejável em algumas situações, como ao usar linguagens ou caracteres específicos.

  • atuação

    utf8mb4_general_ci é mais rápido nas comparações e na classificação, porque requer utf8mb4_general_ci atalhos relacionados ao desempenho.

    Nos servidores modernos, esse aumento de desempenho será quase insignificante. Ele foi criado em uma época em que os servidores tinham uma pequena fração do desempenho da CPU dos computadores atuais.

    utf8mb4_unicode_ci , que usa as regras do Unicode para classificação e comparação, emprega um algoritmo bastante complexo para a classificação correta em uma ampla gama de idiomas e ao usar uma grande variedade de caracteres especiais. Essas regras precisam levar em conta as convenções específicas do idioma; nem todo mundo classifica seus personagens no que chamaríamos de 'ordem alfabética'.

No que diz respeito às linguagens latinas (ou seja, "européias"), não há muita diferença entre a classificação Unicode e a classificação simplificada utf8mb4_general_ci no MySQL, mas ainda existem algumas diferenças:

  • Por exemplo, o agrupamento Unicode classifica "ß" como "ss" e "Œ" como "OE" como pessoas usando esses caracteres normalmente queriam, enquanto utf8mb4_general_ci classifica como caracteres únicos (presumivelmente como "s" e "e" respectivamente ).

  • Alguns caracteres Unicode são definidos como ignoráveis, o que significa que eles não devem contar para a ordem de classificação e a comparação deve passar para o próximo caractere. utf8mb4_unicode_ci lida com isso corretamente.

Em idiomas não latinos, como idiomas asiáticos ou idiomas com alfabetos diferentes, pode haver muito mais diferenças entre a classificação Unicode e a classificação simplificada utf8mb4_general_ci . A adequação do utf8mb4_general_ci dependerá fortemente da linguagem utilizada. Para alguns idiomas, será bastante inadequado.

O que você deve usar?

Não há praticamente nenhuma razão para usar o utf8mb4_general_ci , já que deixamos para trás o ponto em que a velocidade da CPU é baixa o suficiente para que a diferença de desempenho seja importante. Seu banco de dados quase certamente será limitado por outros gargalos do que isso.

A diferença de desempenho só será mensurável em situações extremamente especializadas, e se é você, provavelmente já sabe disso. Se você tiver uma classificação lenta, em quase todos os casos, haverá um problema com seu plano de índices / consulta. Alterar sua função de agrupamento não deve estar no topo da lista de coisas para solucionar problemas.

No passado, algumas pessoas recomendavam o uso de utf8mb4_general_ci exceto quando a classificação precisa seria importante o suficiente para justificar o custo de desempenho. Hoje, esse custo de desempenho praticamente desapareceu, e os desenvolvedores estão tratando a internacionalização mais a sério.

Outra coisa que acrescentarei é que, mesmo que você saiba que seu aplicativo suporta apenas o idioma inglês, talvez ainda precise lidar com os nomes das pessoas, que geralmente contêm caracteres usados ​​em outros idiomas nos quais é tão importante classificar corretamente . Usar as regras do Unicode para tudo ajuda a aumentar a tranquilidade de que as pessoas muito inteligentes do Unicode trabalharam muito para tornar a classificação adequada.


Em poucas palavras:

Se você precisar de uma melhor ordem de classificação - use utf8_unicode_ci (este é o método preferido),

mas se você está totalmente interessado em performance - use utf8_general_ci , mas saiba que isso é um pouco desatualizado.

As diferenças em termos de desempenho são muito pequenas.


Alguns detalhes (PL)

Como podemos ler here ( Peter Gulutzan ) há diferença na classificação / comparação da letra polonesa "Ł" (L com traço - html esc: Ł ) (minúscula: "ł" - html esc: ł ) - temos a seguinte suposição:

utf8_polish_ci      Ł greater than L and less than M
utf8_unicode_ci     Ł greater than L and less than M
utf8_unicode_520_ci Ł equal to L
utf8_general_ci     Ł greater than Z

Em polonês letra do idioma Ł é depois da letra L e antes de M Nenhuma dessas codificações é melhor ou pior - depende das suas necessidades.


Veja o manual do mysql, seção Conjuntos de Caracteres Unicode :

Para qualquer conjunto de caracteres Unicode, as operações executadas usando o agrupamento _general_ci são mais rápidas do que aquelas para o agrupamento _unicode_ci. Por exemplo, comparações para o agrupamento utf8_general_ci são mais rápidas, mas um pouco menos corretas, do que comparações para utf8_unicode_ci. A razão para isto é que o utf8_unicode_ci suporta mapeamentos como expansões; isto é, quando um caractere é comparado como igual a combinações de outros caracteres. Por exemplo, em alemão e algumas outras línguas, “ß” é igual a “ss”. utf8_unicode_ci também suporta contrações e caracteres ignoráveis. utf8_general_ci é um agrupamento herdado que não suporta expansões, contrações ou caracteres ignoráveis. Pode fazer apenas comparações de um para um entre os caracteres.

Então, para resumir, utf_general_ci usa um conjunto de comparações menor e menos correto (de acordo com o padrão) do que utf_unicode_ci, que deve implementar o padrão inteiro. O conjunto general_ci será mais rápido porque há menos computação para fazer.





unicode