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 utilizando la clasificación _general_ci son más rápidas que las de la clasificación _unicode_ci . Por ejemplo, las comparaciones para la intercalación utf8_general_ci son más rápidas, pero un poco menos correctas, que las comparaciones para utf8_unicode_ci. La razón de esto es que utf8_unicode_ci admite mapeos como expansiones; es decir, cuando un personaje se compara como igual a combinaciones de otros personajes. Por ejemplo, en alemán y algunos otros idiomas "ß" es igual a "ss". utf8_unicode_ci también admite contracciones y caracteres ignorables. utf8_general_ci es una recopilació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 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.
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-utf8mb4