Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Migrando problemas e perguntas do MySQL UTF8 para UTF8MB4

  1. 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.

  1. Muito provavelmente você tinha VARCHAR(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).

  2. 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.