sql >> Base de Datos >  >> RDS >> Mysql

¿Cuáles son las diferencias entre utf8_general_ci y utf8_unicode_ci?

utf8_general_ci es una intercalación muy simple, y en Unicode, muy rota, que da resultados incorrectos en texto Unicode general. Lo que hace es:

  • convierte a formato D de normalización Unicode para descomposición canónica
  • elimina cualquier carácter combinado
  • convierte a mayúsculas

Esto no funciona correctamente en Unicode, porque no entiende las mayúsculas y minúsculas de Unicode. Las mayúsculas y minúsculas Unicode por sí solas son mucho más complicadas de lo que puede manejar un enfoque basado en ASCII. Por ejemplo:

  • La minúscula de "ẞ" es "ß", pero la mayúscula de "ß" es "SS".
  • Hay dos sigmas griegos en minúsculas, pero solo uno en mayúsculas; considere “Σίσυφος”.
  • Letras como "ø" no se descomponen en una "o" más un diacrítico, lo que significa que no se ordenarán correctamente.

Hay muchas otras sutilezas.

  1. utf8_unicode_ci utiliza el estándar Algoritmo de intercalación Unicode , admite las llamadas expansiones y ligaduras, por ejemplo:la letra alemana ß (U+00DF LETTER SHARP S) se ordena cerca de "ss"La letra Œ (U+0152 LATIN CAPITAL LIGATURE OE) se ordena cerca de "OE".

utf8_general_ci no admite expansiones/ligaduras, clasifica todas estas letras como caracteres únicos y, a veces, en un orden incorrecto.

  1. utf8_unicode_ci es generalmente más preciso para todos los scripts. Por ejemplo, en el bloque cirílico:utf8_unicode_ci está bien para todos estos idiomas:ruso, búlgaro, bielorruso, macedonio, serbio y ucraniano. Mientras que utf8_general_ci está bien solo para el subconjunto ruso y búlgaro del cirílico. Las letras adicionales utilizadas en bielorruso, macedonio, serbio y ucraniano no están bien ordenadas.

El costo de utf8_unicode_ci es que es un pequeño bits más bajo que utf8_general_ci . Pero ese es el precio que pagas por la corrección. O puede tener una respuesta rápida que sea incorrecta, o una respuesta un poco más lenta que sea correcta. Tu eliges. Es muy difícil justificar dar respuestas incorrectas, por lo que es mejor asumir que utf8_general_ci no existe y usar siempre utf8_unicode_ci . Bueno, a menos que quieras respuestas incorrectas.

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