UTF-8: ¿General? Bin? Unicode?


Estoy tratando de averiguar qué cotejo debería usar para varios tipos de datos. el 100% del contenido que almacenaré es enviado por el usuario.

Entiendo que debería usar UTF-8 General CI (sin distinción de Mayúsculas y Minúsculas) en lugar de UTF-8 Binario. Sin embargo, no puedo encontrar una clara distinción entre UTF-8 General CI y UTF-8 Unicode CI.

  1. ¿Debo almacenar el contenido enviado por el usuario en columnas UTF-8 General o UTF-8 Unicode CI?
  2. Qué tipo de datos serían UTF-8 Binario ser aplicable a?
Author: hjpotter92, 2010-02-26

4 answers

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 soporta asignaciones como expansiones; es decir, cuando un carácter se compara como igual a combinaciones de otros caracteres. 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 intercalación heredada que no admite expansiones, contracciones o caracteres ignorables. Solo puede hacer comparaciones uno a uno entre caracteres.

Citado de: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

Para una explicación más detallada, por favor lea la siguiente publicación de los foros MySQL: http://forums.mysql.com/read.php?103,187048,188748

En cuanto a utf8_bin: Tanto utf8_general_cicomo utf8_unicode_ci realizan comparaciones insensibles a mayúsculas y minúsculas. En constrast, utf8_bin distingue entre mayúsculas y minúsculas (entre otras diferencias), porque compara los valores binarios de la caracter.

 280
Author: Sagi,
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
2011-09-16 16:41:51

También debe tener en cuenta el hecho de que con utf8_general_ci cuando se utiliza un campo varchar como índice único o primario insertar 2 valores como 'a' y 'á' daría un error de clave duplicada.

 85
Author: Alex Hepp,
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
2011-01-19 14:11:30
  • utf8_bin compara los bits ciegamente. Ningún caso de plegado, sin acento de extracción.
  • utf8_general_ci compara un byte con un byte. Se dobla el caso y decapado de acento, pero no hay comparaciones de 2 caracteres: ij no es igual ij en esta comparació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 antiguo estándar Unicode para las comparaciones. ij=ij, pero ae != æ
  • utf8_unicode_520_ci sigue un nuevo estándar Unicode. ae = æ

Ver tabla de colación para detalles sobre lo que es igual a lo que en varias colaciones utf8.

utf8, según lo definido por MySQL está limitado a los códigos utf8 de 1 a 3 bytes. Esto deja fuera Emoji y algunos de los chinos. Así que deberías cambiar a utf8mb4 si quieres ir mucho 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 "utf8"; prácticamente no tiene uso.
 23
Author: Rick James,
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
2016-07-29 17:54:16

Realmente, probé guardar valores como 'é' y 'e' en la columna con índice único y causan errores duplicados en 'utf8_unicode_ci' y 'utf8_general_ci'. Solo puede guardarlos en la columna' utf8_bin'.

Y mysql docs (en http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) sugiere en su conjunto de ejemplos la intercalación 'utf8_general_ci'.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
 6
Author: vitalii,
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
2015-07-01 07:11:34