
🚀 Como Resolver o Erro "Specified key was too long" no MySQL com Doctrine Migrations
Se você já se aventurou pelo mundo das migrações do Doctrine no MySQL, é bem provável que tenha se deparado com esse erro enigmático:
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 3072 bytes
Ele aparece do nada, como aquele bug insistente que só acontece quando o chefe está olhando. Curiosamente, a criação da tabela funciona manualmente no MySQL, mas, ao rodar as migrações pelo Doctrine, o erro persiste. O que está acontecendo? 🤔
🔍 O Mistério dos 3072 Bytes
O problema ocorre porque o MySQL impõe um limite no tamanho das chaves indexadas. Se a soma dos campos indexados ultrapassar 3072 bytes, o banco entra em pânico e solta essa exceção.
Mas por que a criação manual da tabela funciona sem problemas? Simples: ao criar a tabela diretamente no MySQL, o banco pode tomar algumas liberdades e otimizar os índices de forma diferente. Já o Doctrine é um aluno exemplar e segue as regras à risca.
🛠️ Como Resolver
Aqui está um passo a passo infalível para contornar esse erro e continuar suas migrações sem dor de cabeça:
1️⃣ Configure o Doctrine Migrations
No arquivo de configuração das migrações, ajuste o comprimento da coluna da versão para 191 caracteres.
return [ 'table_storage' => [ 'table_name' => 'doctrine_migration_versions', 'version_column_name' => 'version', 'version_column_length' => 191, // Aqui está a mágica! 'executed_at_column_name' => 'executed_at', 'execution_time_column_name' => 'execution_time', ], 'migrations_paths' => [ 'MyProject\Migrations' => '/data/doctrine/migrations/lib/MyProject/Migrations', 'MyProject\Component\Migrations' => './Component/MyProject/Migrations', ], 'all_or_nothing' => true, 'transactional' => true, 'check_database_platform' => true, 'organize_migrations' => 'none', 'connection' => null, 'em' => null, ];
Isso evita que a versão da migração ultrapasse o limite de bytes permitido pelo índice.
2️⃣ Ajuste o Schema do Banco
No arquivo de configuração do Doctrine, certifique-se de definir o charset e a collation corretamente:
return [ 'dbname' => 'seu_banco_de_dados', 'user' => 'root', 'password' => '', 'host' => 'localhost', 'driver' => 'pdo_mysql', 'charset' => 'utf8mb4', 'default_table_options' => [ 'charset' => 'utf8mb4', 'collate' => 'utf8mb4_unicode_ci', ], ];
Isso garante que suas tabelas estejam preparadas para armazenar caracteres Unicode completos sem problemas de compatibilidade.
🤯 A Guerra dos Charsets: utf8 vs utf8mb3 vs utf8mb4
Se você acha que utf8 é sempre utf8, sinto muito, mas sua vida tem sido uma mentira. Vamos esclarecer essa bagunça:
⚠️ utf8 (Na verdade, utf8mb3 disfarçado)
- - Suporta até 3 bytes por caractere.
- - Não aceita emojis, caracteres asiáticos complexos e alguns símbolos matemáticos.
- - No MySQL, utf8 era só um apelido para utf8mb3, mas está sendo depreciado.
🏴☠️ utf8mb3 (O velho mascarado)
- - Nome verdadeiro do antigo utf8.
- - Também usa 3 bytes por caractere.
- - Está sendo abandonado pelo MySQL.
💎 utf8mb4 (O verdadeiro campeão!)
- - Suporta todos os caracteres Unicode, pois usa 4 bytes por caractere.
- - Permite armazenar emojis, caracteres chineses, símbolos raros e matemáticos.
- - É o padrão do MySQL 8.0 e deve ser usado sempre que possível.
🔥 Exemplo de caracteres suportados só pelo utf8mb4:
✅ Emojis: 😃🔥💖
✅ Caracteres raros: 𠜎 𠜱 𠝹
✅ Símbolos matemáticos avançados: 𝛑 𝛿
Se seu banco ainda usa utf8 (aka utf8mb3), corra e mude para utf8mb4 antes que seja tarde demais!
🔗 Links Úteis
Aqui estão algumas referências para você se aprofundar no tema:
📌 Nextcloud Forum - Erro 1071
📌 YouTube - Resolvendo erro 1071
📌 GitHub - Issue sobre erro 1071
📌 Documentação Oficial do Doctrine
🎯 Conclusão
Se você está enfrentando o erro 1071 no MySQL, siga esses passos:
✅ Reduza o tamanho das colunas indexadas (191 caracteres para colunas de versão).
✅ Defina o charset correto para evitar surpresas desagradáveis.
✅ Use utf8mb4 para garantir compatibilidade total com Unicode.
Agora, vá e migre seus dados sem medo! 🚀