- Existem limites para o tamanho de um ÍNDICE. Você atingiu o limite porque o utf8mb4 precisa de até 4 bytes por caractere , onde utf8 precisa apenas de 3. Enquanto isso, o limite de tamanho do INDEX está em bytes .
A 'solução' é decidir o que fazer com o índice superdimensionado. (mais abaixo)
2.
ALTER TABLE t CHANGE col col ...
é o mesmo que o mais lógico
ALTER TABLE t MODIFY col ...
O primeiro permite que você altere o nome da coluna, portanto, duas cópias do nome da coluna quando você não precisa alterar o nome.
-
Muito provavelmente você tinhaVARCHAR(255)
que leva 767 bytes em utf8 (3*255+2; o "2" é o tamanho do campo de comprimento). O equivalente no utf8mb4 de 4 bytes seria (191) (4*191+2=766; não há espaço para mais de 191).
-
Não vi um artigo sobre isso. Suspeito que o que acabei de dizer é a maior parte do que precisa ser dito.
Então...
Plano A :Você tem
foo VARCHAR(255)
e era utf8? Os dados nele sempre (agora e no futuro) são menores que 191 caracteres? Se sim, então simplesmente faça o ALTER. Plano B :Se você precisa de mais de 191, você realmente precisa do INDEX? DROP INDEX pode ser uma alternativa.
Plano C :Ou, você pode usar um índice "prefixo":
INDEX(foo(191))
, deixando VARCHAR(255)
. Normalmente, os índices de "prefixo" são inúteis, mas você pode tem um caso de uso para o qual funciona. Para discutir mais sobre isso, forneça
SHOW CREATE TABLE
para a tabela em questão e discuta o significado desse campo específico e seu ÍNDICE.