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.
Tengo entendido que debería usar UTF-8 General CI (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.
- ¿Debo almacenar contenido enviado por el usuario en columnas UTF-8 General o UTF-8 Unicode CI?
- ¿A qué tipo de datos se aplicaría UTF-8 Binary?
utf8
,utf8mb4
úsela para obtener soporte completo para UTF-8. Comentando aquí porque las respuestas a esta pregunta popular no abordan esto. mathiasbynens.be/notes/mysql-utf8mb4Respuestas:
En general, utf8_general_ci es más rápido que utf8_unicode_ci , pero menos correcto.
Aquí está la diferencia:
Citado de: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Para obtener 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: utf8_general_ci y utf8_unicode_ci realizan una comparación que no distingue entre mayúsculas y minúsculas. En contraste, utf8_bin distingue entre mayúsculas y minúsculas (entre otras diferencias), ya que compara los valores binarios de los caracteres.
fuente
show collation;
permite ver la clasificación predeterminada para cada conjunto de caracteres. 5.1 muestrautf8_general_ci
como predeterminado parautf8
.También debe tener en cuenta el hecho de que con utf8_general_ci al usar un campo varchar como índice único o primario, insertar 2 valores como 'a' y 'á' daría un error de clave duplicado.
fuente
utf8_unicode_ci
utf8_bin
compara los bits a ciegas. Sin plegado de la caja, sin pelado.utf8_general_ci
compara un byte con un byte. Hace plegado de mayúsculas y minúsculas , pero no hay comparaciones de 2 caracteres:ij
no es igualij
en esta colación.utf8_*_ci
es un conjunto de reglas específicas del idioma, pero por lo demás me gustaunicode_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
=æ
Consulte la tabla de colación para obtener detalles sobre qué es igual a qué en varias colaciones utf8.
utf8
, tal como lo define MySQL, está limitado a los códigos utf8 de 1 a 3 bytes. Esto deja fuera a Emoji y algunos chinos. Por lo tanto, debería cambiarseutf8mb4
si quiere ir mucho más allá de Europa.Los puntos anteriores se aplican a
utf8mb4
, después de un cambio de ortografía adecuado. En adelante,utf8mb4
yutf8mb4_unicode_520_ci
son preferidos.fuente
Realmente, probé guardando valores como 'é' y 'e' en la columna con índice único y causan errores duplicados en 'utf8_unicode_ci' y '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 su conjunto de ejemplos la recopilación 'utf8_general_ci'.
fuente
La respuesta aceptada está desactualizada.
Si usa MySQL 5.5.3+, use en
utf8mb4_unicode_ci
lugar deutf8_unicode_ci
para asegurarse de que los caracteres escritos por sus usuarios no le darán errores.utf8mb4
admite emojis, por ejemplo, mientras queutf8
podría darte cientos de errores relacionados con la codificación como:Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
fuente
utf8mb4_unicode_ci
trata (creo) todos los Emoji como iguales.utf8mb4_unicode_520_ci
da una orden a Emoji.