¿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 al diseñar una base de datos?

Author: Community, 2009-06-24

2 answers

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

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

Esto no funciona correctamente en Unicode, porque no entiende la carcasa Unicode. Carcasa Unicode solo es mucho más complicado que un Enfoque ASCII-mente puede manejar. 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úscula; considere "Σίσυφος".
  • Las letras como "ø" no se descomponen en una "o" más un diacrítico, lo que significa que no se ordenará correctamente.

Hay muchas otras sutilezas.

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

utf8_general_ci no soporta expansiones / ligaduras, ordena todas estas letras como caracteres individuales, y a veces en un orden incorrecto.

  1. utf8_unicode_cies 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 de cirílico. Letras adicionales usadas en bielorruso, Macedonio, Serbio y ucraniano no están bien ordenados.

El costo de utf8_unicode_ci es que es un bit pequeño más lento que utf8_general_ci. Pero ese es el precio que pagas por la corrección. O puedes tener una respuesta rápida que está mal, o una respuesta un poco más lenta que es derecho. Tú eliges. Es muy difícil justificar siempre dar respuestas incorrectas, así que es mejor asumir que utf8_general_ci no existe y usar siempre utf8_unicode_ci. Bueno, a menos que quieras respuestas equivocadas.

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

 122
Author: Timotei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 05:48:54

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 como expansiones; es decir, cuando un carácter se compara como igual a combinaciones de otros caracter. Por ejemplo, en alemán y otros idiomas "ß" es igual a "ss". utf8_unicode_ci también soporta contracciones y caracteres ignorables. utf8_general_ci es una compilación heredada que no admite expansiones, contracciones o caracteres ignorables. Solo puede hacer comparaciones uno a uno entre caracteres.

 19
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-24 04:55:51