Em geral, utf8_general_ci é mais rápido que utf8_unicode_ci , mas menos correto.
Aqui está a diferença:
Para qualquer conjunto de caracteres Unicode, as operações executadas usando o agrupamento _general_ci são mais rápidas que as do agrupamento _unicode_ci . Por exemplo, as comparações para o agrupamento utf8_general_ci são mais rápidas, mas um pouco menos corretas, do que as comparações para utf8_unicode_ci. A razão para isso é que utf8_unicode_ci suporta mapeamentos como expansões; isto é, quando um caractere é comparado com combinações de outros caracteres. Por exemplo, em alemão e em alguns outros idiomas "ß" é igual a "ss". utf8_unicode_ci também suporta contrações e caracteres ignoráveis. utf8_general_ci é um agrupamento legado que não suporta expansões, contrações ou caracteres ignoráveis. Ele pode fazer apenas comparações individuais entre os caracteres.
Citado em:
http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Para uma explicação mais detalhada, leia a seguinte publicação nos fóruns do MySQL:
http://forums.mysql.com/read.php?103,187048,188748
Quanto ao utf8_bin: utf8_general_ci e utf8_unicode_ci executam uma comparação que não diferencia maiúsculas de minúsculas. Em contraste, utf8_bin faz distinção entre maiúsculas e minúsculas (entre outras diferenças), porque compara os valores binários dos caracteres.
utf8
, use emutf8mb4
vez disso para suporte total ao UTF-8. Comentando aqui porque as respostas sobre essa pergunta popular não abordam isso. mathiasbynens.be/notes/mysql-utf8mb4