2009-06-24 17 views
75

Duplicar posible:
What's the difference between utf8_general_ci and utf8_unicode_ci¿Cuáles son las diferencias entre utf8_general_ci y utf8_unicode_ci?

Tengo dos opciones para Unicode que parecen prometedores para una base de datos MySQL.

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

¿Puede usted explicar lo que 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?

+0

Véase también http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci – unor

Respuesta

119

utf8_general_ci es una muy simple - y en Unicode, muy roto - cotejo, que da resultados incorrectos en texto general Unicode. Lo que hace es:

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

Esto no funciona correctamente en Unicode, porque no entiende 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 utiliza el estándar Unicode Collation Algorithm, soporta llamadas expansiones y ligaduras, por ejemplo: ß carta alemanes (U + 00DF dura carta S) se ordenan cerca "ss" Carta OE (U + 0152 latina mayúscula LIGADURAS OE) está ordenada cerca de "OE".

utf8_general_ci no soporta expansiones/ligaduras, ordena todas estas cartas como personajes individuales, ya 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 están bien ordenadas.

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

+1

Regalos a la lista de idiomas – reconbot

+3

se parece esta respuesta fue copiada directamente del foro mysql http://forums.mysql.com/read.php?103,187048,188748#msg-188748 – Matt

+0

@Matt: bueno, algunos de nosotros buscamos en google: P – Timotei

19

De Unicode Character Sets en el MySQL documentation:

Para cualquier conjunto de caracteres Unicode, operaciones realizadas con la intercalación de _general_ci son más rápidos que los de la _unicode_ci colación. 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 para 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 intercalación de herencia que no admite expansiones, contracciones o caracteres ignorables. Solo puede hacer comparaciones uno a uno entre los personajes.

Cuestiones relacionadas