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_cicomo 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_ciutf8_bincompara los bits a ciegas. Sin plegado de la caja, sin pelado.utf8_general_cicompara un byte con un byte. Hace plegado de mayúsculas y minúsculas , pero no hay comparaciones de 2 caracteres:ijno es igualijen esta colación.utf8_*_cies un conjunto de reglas específicas del idioma, pero por lo demás me gustaunicode_ci. Algunos casos especiales:Ç,Č,ch,llutf8_unicode_cisigue un antiguo estándar Unicode para las comparaciones.ij=ij, peroae! =æutf8_unicode_520_cisigue 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 cambiarseutf8mb4si 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,utf8mb4yutf8mb4_unicode_520_cison 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_cilugar deutf8_unicode_cipara asegurarse de que los caracteres escritos por sus usuarios no le darán errores.utf8mb4admite emojis, por ejemplo, mientras queutf8podría darte cientos de errores relacionados con la codificación como:Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1fuente
utf8mb4_unicode_citrata (creo) todos los Emoji como iguales.utf8mb4_unicode_520_cida una orden a Emoji.