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

Posible duplicado:
Cuál es la diferencia entre utf8_general_ci y utf8_unicode_ci

Tengo dos opciones para unicode que parecen prometedoras para una base de datos mysql.

utf8_general_ci unicode (multilingual), case-insensitive utf8_unicode_ci unicode (multilingual), case-insensitive 

¿Puede explicar cuál es la diferencia entre utf8_general_ci y utf8_unicode_ci? ¿Cuáles son los efectos de elegir uno sobre el otro cuando se diseña una base de datos?

utf8_general_ci es una utf8_general_ci muy simple, y en Unicode, muy fragmentada, que da resultados incorrectos en el texto general de Unicode. Lo que hace es:

  • convierte a formato de normalización Unicode D para la descomposición canónica
  • elimina cualquier combinación de caracteres
  • convierte a mayúsculas

Esto no funciona correctamente en Unicode, porque no comprende la carcasa Unicode. La carcasa Unicode por sí sola es mucho más complicada de lo que puede manejar un enfoque ASCII. Por ejemplo:

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

Hay muchas otras sutilezas.

  1. utf8_unicode_ci usa el Algoritmo de utf8_unicode_ci Unicode estándar, admite las llamadas expansiones y ligaduras, por ejemplo: La letra alemana ß (U + 00DF LETRA SHARP S) está ordenada cerca de “ss” La letra Œ (U + 0152 LITERATURA CAPITAL LATÍN OE) está ordenada cerca ” OE “.

utf8_general_ci no es compatible con expansiones / ligaduras, ordena todas estas letras como caracteres individuales 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 de cirílico ruso y búlgaro. Las letras adicionales utilizadas en bielorruso, macedonio, serbio y ucraniano no se clasifican correctamente.

El costo de utf8_unicode_ci es que es un poco más lento que utf8_general_ci . Pero ese es el precio que paga por la corrección. O bien puede tener una respuesta rápida que está mal, o una respuesta muy leve que es correcta. Tu elección. Es muy difícil justificar dar respuestas incorrectas, por lo que es mejor suponer 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

De conjuntos de caracteres Unicode en la documentación de MySQL :

Para cualquier conjunto de caracteres Unicode, las operaciones realizadas usando la intercalación _general_ci son más rápidas que las de la intercalación _unicode_ci . Por ejemplo, las comparaciones para la intercalación utf8_general_ci son más rápidas, pero ligeramente menos correctas, que las comparaciones para utf8_unicode_ci . La razón de esto es que utf8_unicode_ci admite asignaciones tales como expansiones; es decir, cuando un personaje se compara como igual a las combinaciones de otros personajes. Por ejemplo, en alemán y en otros idiomas, ” ß ” es igual a ” ss “. utf8_unicode_ci también admite contracciones y caracteres ignorables. utf8_general_ci es una clasificación heredada que no admite expansiones, contracciones o caracteres ignorables. Solo puede hacer comparaciones uno a uno entre los personajes.