Hola a tod@s,
Hace unas semanas, cuando tuve que introducirme en el mundo MySQL, me quedaban constantemente dudas y preguntas. He tenido que hacer uso de San Google para que me las pudiera solucionar.
La duda surgía cada vez que tenía que crear una tabla, una campo de una tabla, la base de datos… ya que había un campo que no sabía que seleccionar, EL COTEJAMIENTO (así como lo está traduciendo MySQL, aunque en los manuales también estoy leyendo la palabra “COLACIÓN”.
Como codificación, yo siempre elegía el UTF-8, y ya está…, del cotejamiento no tenía NI IDEA. Entonces, buscando pude encontrar las diferencias que tenían los cotejamientos: utf8_unicode_ci y el utf8_general_ci, ambos los más conocidos de UTF8.
Opinión: Desde mi punto vista el objetivo principal de los cotejamientos es el de proporcionar una codificación UTF-8, pero los objetivos que se puedan plantear, individualmente, cada cotejamiento son totalmente distintos, los cuales intentan tener en cuenta la precisión, la rapidez, la internacionalidad…
Características utf8_unicode_ci
- No soporta parcialmente el Algoritmo de Colación Unicode
- Aunque no soporte totalmente el Algoritmo de Colación Unicode, la característica más significativa es que soporta EXPANSIONES, esto es visible o palpable: “cuando hacemos una comparación de caracteres, un carácter resulta igual a una combinación de caracteres, por ejemplo, ‘ß’ => ’ss’ “
Características utf8_general_ci
- Es una colación heredada, la cual NO soporta EXPANSIONES.
- Sólo puede hacer comparaciones entre caracteres uno a uno
- Estas comparaciones son muy rápidas
UTF8_Unicode_ci VS UTF8_General_ci
Los tiros van por el último punto del utf8_general_ci que he expuesto, La Rapidez. Pero nos tenemos que hacer la siguiente pregunta:
¿Queremos RAPIDEZ o PRECISIÓN?
Con estos dos tipos de colaciones no podemos tener ambas a la vez, por lo tanto, nos decantaremos por una sola. Dependiendo de cual nos decantemos elegiremos la colación:
- Rapidez = utf8_general_ci
- Precisión = utf8_unicode_ci
Especifiquemos el POR QUÉ:
Utf8_unicode_ci, al soportar Expansiones, permite que un carácter (el ‘ß’ en Alemán, por ejemplo) se transforme en una combinación de caracteres (el ’ss’ del ejemplo anterior). Entonces esta colación tiene en cuenta esta posibilidad a la hora de hacer una comparación entre caracteres.
En cambio, el utf8_general_ci, al no soportar EXPANSIONES la comparación de ‘ß’ es ’s’ porque solamente mira un carácter. Esto significa que estas comparaciones son más rápidas pero ‘ligeramente’ menos correctas.
Comparaciones correctas en ambas colaciones:
Ä = A
Ö = O
Ü = U
Comparaciones incorrectas para utf8_general_ci:
ß = s
Si en nuestra Página Web, aplicación,… no tiene que haber problemas con caracteres ‘raros’, la elección es utf8_general_ci, es mucho más rápido. De lo contrario la colación debería ser utf8_unicode_ci.
Os pongo el link de donde he sacado la info: MySQL5 Reference.
Definitivamente este post me ha caido de perlas…. esto era justamente lo que estaba buscando en el día de ayer mientras hacia el diseño de una base de datos para desarrollar un aplicativo en mi Universidad…. mil gracias!
[...] http://www.bibigeek.com/2009/10/05/mysql-la-codificacion-utf8-y-su-cotejamiento/ [...]