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

Quais são as diferenças entre utf8_general_ci e utf8_unicode_ci?


utf8_general_ci é um agrupamento muito simples — e em Unicode, muito quebrado — que fornece resultados incorretos em texto Unicode geral. O que ele faz é:
  • converte para a forma de normalização Unicode D para decomposição canônica
  • remove qualquer combinação de caracteres
  • converte para maiúsculas

Isso não funciona corretamente em Unicode, porque ele não entende o uso de maiúsculas e minúsculas Unicode. A caixa Unicode sozinha é muito mais complicada do que uma abordagem voltada para ASCII pode lidar. Por exemplo:
  • A minúscula de “ẞ” é “ß”, mas a maiúscula de “ß” é “SS”.
  • Existem dois sigmas gregos minúsculos, mas apenas um maiúsculo; considere “Σίσυφος”.
  • Letras como "ø" não se decompõem em um "o" mais um diacrítico, o que significa que não serão classificadas corretamente.

Existem muitas outras sutilezas.
  1. utf8_unicode_ci usa o algoritmo de agrupamento Unicode padrão , suporta as chamadas expansões e ligaduras, por exemplo:A letra alemã ß (U+00DF LETTER SHARP S) é classificada perto de "ss"A letra Œ (U+0152 LATIN CAPITAL LIGATURE OE) é classificada perto de "OE".

utf8_general_ci não suporta expansões/ligaduras, ele classifica todas essas letras como caracteres únicos e, às vezes, em uma ordem errada.
  1. utf8_unicode_ci é geralmente mais preciso para todos os scripts. Por exemplo, no bloco cirílico:utf8_unicode_ci é bom para todos estes idiomas:russo, búlgaro, bielorrusso, macedônio, sérvio e ucraniano. Enquanto utf8_general_ci é bom apenas para o subconjunto russo e búlgaro do cirílico. Letras extras usadas em bielorrusso, macedônio, sérvio e ucraniano não são bem classificadas.

O custo de utf8_unicode_ci é que é um pouco bits menor que utf8_general_ci . Mas esse é o preço que você paga pela correção. Ou você pode ter uma resposta rápida que está errada, ou uma resposta um pouco mais lenta que está certa. Sua escolha. É muito difícil justificar dar respostas erradas, então é melhor supor que utf8_general_ci não existe e usar sempre utf8_unicode_ci . Bem, a menos que você queira respostas erradas.

Fonte:http://forums.mysql.com/read .php?103,187048,188748#msg-188748