UTF-8: ¿General? ¿Compartimiento? Unicode?

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.

  1. ¿Debo almacenar contenido enviado por el usuario en las columnas UTF-8 General o UTF-8 Unicode CI?
  2. ¿A qué tipo de datos se aplicará UTF-8 Binary?

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 .

  • utf16 y utf32 son variantes en utf8; prácticamente no hay uso para ellos.
  • ucs2 está más cerca de “Unicode” que de “utf8”; prácticamente no hay uso para eso.

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