Encontramos esse problema ao tentar adicionar um índice UNIQUE a um campo VARCHAR (255) usando utf8mb4. Embora o problema já esteja bem delineado aqui, eu gostaria de acrescentar alguns conselhos práticos sobre como descobrimos e resolvemos isso.
Ao usar utf8mb4, os caracteres contam como 4 bytes, enquanto em utf8, eles podem ter 3 bytes. Os bancos de dados do InnoDB têm um limite que os índices podem conter apenas 767 bytes. Portanto, ao usar utf8, você pode armazenar 255 caracteres (767/3 = 255), mas usando utf8mb4, você pode armazenar apenas 191 caracteres (767/4 = 191).
Você é absolutamente capaz de adicionar índices regulares para VARCHAR(255)
campos usando utf8mb4, mas o que acontece é que o tamanho do índice é truncado automaticamente em 191 caracteres - como unique_key
aqui:
Isso é bom, porque índices regulares são usados apenas para ajudar o MySQL a pesquisar seus dados mais rapidamente. O campo inteiro não precisa ser indexado.
Então, por que o MySQL trunca o índice automaticamente para índices regulares, mas gera um erro explícito ao tentar fazer isso para índices exclusivos? Bem, para que o MySQL possa descobrir se o valor que está sendo inserido ou atualizado já existe, ele precisa indexar todo o valor e não apenas parte dele.
No final do dia, se você deseja ter um índice exclusivo em um campo, todo o conteúdo do campo deve caber no índice. Para utf8mb4, isso significa reduzir o comprimento do campo VARCHAR para 191 caracteres ou menos. Se você não precisar de utf8mb4 para essa tabela ou campo, poderá devolvê-lo ao utf8 e poder manter seus 255 campos de comprimento.