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.
- ¿Debo almacenar el contenido enviado por el usuario en columnas UTF-8 General o UTF-8 Unicode CI?
- Qué tipo de datos serían UTF-8 Binario ser aplicable a?
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.
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.
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 igualij
en esta comparación. -
utf8_*_ci
es un conjunto de reglas específicas del lenguaje, pero por lo demás comounicode_ci
. Algunos casos especiales:Ç
,Č
,ch
,ll
-
utf8_unicode_ci
sigue un antiguo estándar Unicode para las comparaciones.ij
=ij
, peroae
!=æ
-
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.
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
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