Pregunta ¿Cuáles son las diferencias entre utf8_general_ci y utf8_unicode_ci? [duplicar]


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?


76
2018-06-24 04:49


origen


Respuestas:


utf8_general_ci es una colación muy simple, y en Unicode, muy fragmentada, una que da resultados incorrectos en texto Unicode general. 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 estándar Algoritmo de intercalación Unicode, 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 LIGA DE CAPTURA LATINA OE) está ordenada 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 en general 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. Letras adicionales utilizadas en bielorruso, macedonio, serbio y ucraniano están clasificados no bien

El costo de utf8_unicode_ci es que es un pequeño 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 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


122
2018-06-24 04:55



De Juegos de caracteres Unicode en el Documentación de MySQL:

Para cualquier conjunto de caracteres Unicode, las operaciones realizadas usando el _general_ci colación son más rápidos que los de la _unicode_ci colación. Por ejemplo, comparaciones para el utf8_general_ci la intercalación es más rápida, pero ligeramente menos correcta, 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 personajes 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.


19