Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Qual é a diferença entre utf8_general_ci e utf8_unicode_ci?


Para as pessoas que ainda chegarem a essa pergunta em 2020 ou depois, há opções mais recentes que podem ser melhores que ambas destes. Por exemplo, utf8mb4_0900_ai_ci .

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

_unicode_ci e _general_ci são dois conjuntos diferentes de regras para classificar e comparar texto de acordo com a maneira que esperamos. Versões mais recentes do MySQL também apresentam novos conjuntos de regras, como _0900_ai_ci para regras equivalentes baseadas em Unicode 9.0 - e sem equivalente _general_ci variante. As pessoas que estão lendo isso agora provavelmente devem usar um desses agrupamentos mais recentes em vez de _unicode_ci ou _general_ci . A descrição desses agrupamentos mais antigos abaixo é fornecida apenas para fins de interesse.

O MySQL está atualmente em transição de uma implementação UTF-8 mais antiga e com falhas. Por enquanto, você precisa usar utf8mb4 em vez de utf8 para a parte de codificação de caracteres, para garantir que você esteja obtendo a versão corrigida. A versão defeituosa permanece para compatibilidade com versões anteriores, embora esteja sendo preterida.

Diferenças importantes

  • utf8mb4_unicode_ci é baseado nas regras oficiais Unicode para classificação e comparação universal, que classifica com precisão em uma ampla variedade de idiomas.

  • utf8mb4_general_ci é um conjunto simplificado de regras de classificação que visa fazer o melhor possível, enquanto toma muitos atalhos projetados para melhorar a velocidade. Ele não segue as regras Unicode e resultará em classificação ou comparação indesejável em algumas situações, como ao usar idiomas ou caracteres específicos.

    Em servidores modernos, esse aumento de desempenho será praticamente insignificante. Foi concebido em uma época em que os servidores tinham uma pequena fração do desempenho da CPU dos computadores atuais.

Benefícios de utf8mb4_unicode_ci sobre utf8mb4_general_ci

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

No que diz respeito aos idiomas latinos (ou seja, "europeus"), não há muita diferença entre a classificação Unicode e o utf8mb4_general_ci simplificado classificação no MySQL, mas ainda existem algumas diferenças:

  • Por exemplo, o agrupamento Unicode classifica "ß" como "ss" e "Œ" como "OE" como as pessoas que usam esses caracteres normalmente desejam, enquanto utf8mb4_general_ci os 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 o utf8mb4_general_ci simplificado Ordenação. A adequação de utf8mb4_general_ci dependerá muito da linguagem utilizada. Para alguns idiomas, será bastante inadequado.

O que você deve usar?

Quase certamente não há razão para usar utf8mb4_general_ci mais, pois 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 além deste.

No passado, algumas pessoas recomendavam usar utf8mb4_general_ci exceto quando a classificação precisa fosse 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 com mais seriedade.

Há um argumento a ser feito de que, se a velocidade é mais importante para você do que a precisão, é melhor não fazer nenhuma classificação. É trivial tornar um algoritmo mais rápido se você não precisar que ele seja preciso. Então, utf8mb4_general_ci é um compromisso que provavelmente não é necessário por motivos de velocidade e provavelmente também não é adequado por motivos de precisão.

Uma outra coisa que acrescentarei é que mesmo que você saiba que seu aplicativo suporta apenas o idioma inglês, ele ainda pode precisar lidar com nomes de pessoas, que geralmente podem conter caracteres usados ​​em outros idiomas nos quais é tão importante classificar corretamente . Usar as regras do Unicode para tudo ajuda a ter a certeza de que as pessoas muito inteligentes do Unicode trabalharam muito para fazer a classificação funcionar corretamente.

O que as partes significam

Em primeiro lugar, ci é para não diferencia maiúsculas de minúsculas classificação e comparação. Isso significa que é adequado para dados textuais e maiúsculas e minúsculas não são importantes. Os outros tipos de agrupamento são cs (diferencia maiúsculas de minúsculas) para dados textuais onde maiúsculas e minúsculas são importantes e bin , para onde a codificação precisa corresponder, bit por bit, o que é adequado para campos que são realmente dados binários codificados (incluindo, por exemplo, Base64). A classificação com distinção entre maiúsculas e minúsculas leva a alguns resultados estranhos e a comparação com distinção entre maiúsculas e minúsculas pode resultar em valores duplicados diferindo apenas em maiúsculas e minúsculas, portanto, os agrupamentos com distinção entre maiúsculas e minúsculas estão caindo em desuso para dados textuais - se maiúsculas e minúsculas são significativas para você, então a pontuação ignorável e assim por diante provavelmente também é significativo, e um agrupamento binário pode ser mais apropriado.

Em seguida, unicode ou general refere-se às regras específicas de classificação e comparação - em particular, a forma como o texto é normalizado ou comparado. Existem muitos conjuntos diferentes de regras para a codificação de caracteres utf8mb4, com unicode e general sendo dois que tentam funcionar bem em todas as linguagens possíveis ao invés de uma específica. As diferenças entre esses dois conjuntos de regras são o assunto desta resposta. Observe que unicode usa regras do Unicode 4.0. Versões recentes do MySQL adicionam os conjuntos de regras unicode_520 usando regras do Unicode 5.2 e 0900 (eliminando a parte "unicode_") usando regras do Unicode 9.0.

E por último, utf8mb4 é claro que a codificação de caracteres usada internamente. Nesta resposta, estou falando apenas sobre codificações baseadas em Unicode.