Skip to content

Instantly share code, notes, and snippets.

@locopine
Created April 1, 2022 16:12
Show Gist options
  • Save locopine/aaf0c1735db555e3b8829f4f15811f59 to your computer and use it in GitHub Desktop.
Save locopine/aaf0c1735db555e3b8829f4f15811f59 to your computer and use it in GitHub Desktop.
Laravel + MySQL <= 5.6.x - Syntax error or access violation: 1071 Specified key was too long;

Por quê MySQL retorna exceção ao executar migração em ambiende MySQL <= v5.6.x.

Illuminate\Database\QueryException 

  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

Após longo debate com o suporte de uma famosa empresa de hospedagem e colocado em uma fila de espera para ter o DB migrado para versão MySQL >= v. 5.7, fiz minha própria analise para entender o porquê de tal comportamento. Consultei informações na web e me deparei com alguns comentários referente a cálculo de bytes, como pode ser visto no site Stack Exchange mais especificamente na parte de Database Administrators, onde no final de uma das respostas uma observação feita chamou minha atenção: "Also, have a look at why varchar(255) is a bad idea."!

Sendo assim, ao revisar o "dump" e a saída gerada pelas migrations, percebi que todos os campos varchar estavam como VARCHAR(255), onde certamente era meu problema. Após alterar todos os VARCHAR(255) para VARCHAR(191) (padrão para MySQL >= v. 5.7) meu problema foi resolvido.


Como resolver sem tanto trabalho?

Apenas inclua as seguintes linhas em seu App\Providers\AppServiceProvider.php:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;  // Inclua essa linha <----

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);  // Inclua essa linha <----
    }
}

Feito isso seus problemas estarão resolvidos!!!

Espero que ajude alguém.

[]'s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment