Estoy tratando de averiguar qué colación debo usar para varios tipos de datos. El usuario debe enviar el 100% del contenido que almacenaré.
Según entiendo, debería usar UTF-8 General CI (distinción entre mayúsculas y minúsculas) en lugar de UTF-8 Binary. Sin embargo, no puedo encontrar una distinción clara entre UTF-8 General CI y UTF-8 Unicode CI.
En general, utf8_general_ci es más rápido que utf8_unicode_ci , pero menos correcto.
Aquí está la diferencia:
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.
Citado de: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Para una explicación más detallada, lea la siguiente publicación de los foros de MySQL: http://forums.mysql.com/read.php?103,187048,188748
En cuanto a utf8_bin: tanto utf8_general_ci como utf8_unicode_ci realizan una comparación insensible a mayúsculas y minúsculas. En contraste, utf8_bin distingue entre mayúsculas y minúsculas (entre otras diferencias), porque compara los valores binarios de los caracteres.
También debe tener en cuenta el hecho de que con utf8_general_ci cuando se usa un campo varchar como índice único o primario, insertar 2 valores como ‘a’ y ‘á’ daría un error de clave duplicado.
utf8_bin
compara los bits a ciegas. Sin doblar caso, sin acento. utf8_general_ci
compara un byte con un byte. Realiza plegado de casos y acentos, pero no comparaciones de 2 caracteres: ij
no es igual ij
en esta intercalación. utf8_*_ci
es un conjunto de reglas específicas del lenguaje, pero por lo demás como unicode_ci
. Algunos casos especiales: Ç
, Č
, ch
, ll
utf8_unicode_ci
sigue un viejo estándar Unicode para las comparaciones. ij
= ij
, pero ae
! = æ
utf8_unicode_520_ci
sigue un nuevo estándar Unicode. ae
= æ
Consulte el cuadro de intercalación para obtener detalles sobre lo que es igual a lo que se encuentra en varias intercalaciones de utf8.
utf8
, tal como se define en MySQL está limitado a los códigos utf8 de 1 a 3 bytes. Esto deja fuera Emoji y algunos de los chinos. Entonces realmente debería cambiar a utf8mb4
si quiere ir más allá de Europa.
Los puntos anteriores se aplican a utf8mb4
, después de un cambio de ortografía adecuado. En el futuro, se prefieren utf8mb4
y utf8mb4_unicode_520_ci
.
Realmente, probé los valores de guardado como ‘é’ y ‘e’ en la columna con índice único y causan errores duplicados tanto en ‘utf8_unicode_ci’ como ‘utf8_general_ci’. Puede guardarlos solo en la columna intercalada ‘utf8_bin’.
Y los documentos de mysql (en http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) sugieren en sus ejemplos la intercalación ‘utf8_general_ci’.
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci