utf8
do MySQL codificação não UTF-8 real. É uma codificação parecida com UTF-8, mas suporta apenas um subconjunto do que o UTF-8 suporta. utf8mb4
é real UTF-8. Essa diferença é um detalhe de implementação interna do MySQL. Ambos se parecem com UTF-8 no lado do PHP. Se você usa utf8
ou utf8mb4
, o PHP obterá UTF-8 válido em ambos os casos. O que você precisa ter certeza é que a codificação de conexão entre PHP e MySQL está definido como
utf8mb4
. Se estiver definido como utf8
, o MySQL não suportará todos os caracteres. Você define esta codificação de conexão usando mysql_set_charset()
, o PDO charset
Parâmetro de conexão DSN ou qualquer outro método apropriado para sua API de banco de dados de escolha. mb_internal_encoding
apenas define o valor padrão para o $encoding
parâmetro todos mb_*
funções têm. Não tem nada a ver com o MySQL. UTF-8 e UTF-32 diferem na forma como codificam os caracteres. UTF-8 usa um mínimo de 1 byte para um caractere e no máximo 4. UTF-32 sempre usa 4 bytes para cada caractere. O UTF-16 usa no mínimo 2 bytes e no máximo 4.
Devido ao seu comprimento variável, o UTF-8 tem um pouco de overhead. Um caractere que pode ser codificado em 2 bytes em UTF-16 pode levar 3 ou 4 em UTF-8; por outro lado, UTF-16 nunca usa menos do que 2 bytes. Se você estiver armazenando muito texto asiático, o UTF-16 poderá usar menos armazenamento. Se a maior parte do seu texto for inglês/ASCII, UTF-8 usará menos armazenamento. UTF-32 sempre usa mais armazenamento.