UTF-8 é uma codificação de comprimento variável. No caso de UTF-8, isso significa que o armazenamento de um ponto de código requer de um a quatro bytes. No entanto, a codificação do MySQL chamada "utf8" (alias de "utf8mb3") armazena apenas um máximo de três bytes por ponto de código.
Portanto, o conjunto de caracteres "utf8" / "utf8mb3" não pode armazenar todos os pontos de código Unicode: ele suporta apenas o intervalo de 0x000 a 0xFFFF, que é chamado de " Plano multilíngue básico ". Consulte também Comparação de codificações Unicode .
Isto é o que (uma versão anterior da mesma página em) a documentação do MySQL tem a dizer sobre isso:
O conjunto de caracteres nomeado utf8 [/ utf8mb3] usa no máximo três bytes por caractere e contém apenas caracteres BMP. No MySQL 5.5.3, o conjunto de caracteres utf8mb4 usa no máximo quatro bytes por caractere que suporta caracteres suplementares:
Para um caractere BMP, utf8 [/ utf8mb3] e utf8mb4 têm características de armazenamento idênticas: mesmos valores de código, mesma codificação, mesmo comprimento.
Para um caractere suplementar, utf8 [/ utf8mb3] não pode armazenar o caractere , enquanto utf8mb4 requer quatro bytes para armazená-lo. Como utf8 [/ utf8mb3] não pode armazenar o caractere, você não possui caracteres suplementares nas colunas utf8 [/ utf8mb3] e não precisa se preocupar com a conversão de caracteres ou com a perda de dados ao atualizar dados utf8 [/ utf8mb3] de versões mais antigas MySQL.
Portanto, se você deseja que sua coluna suporte o armazenamento de caracteres fora do BMP (e geralmente o deseja), como emoji , use "utf8mb4". Consulte também Quais são os caracteres Unicode não BMP mais comuns em uso real? .