user photo

Desenvolvedora Web | PHP | Laravel |

Banco de Dados

🚀 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! 🚀


Discussion

Categories

  • Banco de Dados 1
  • BackEnd 1