Aprende cómo corregir el error de la clave especificada fue una excepción demasiado larga en laravel durante las migraciones de esquema.

Arreglando la excepción "La clave especificada era un error demasiado largo" en Laravel 5.4

Desde Laravel 5.4, hubo un pequeño cambio en el juego de caracteres predeterminado de la base de datos. Ahora, el juego de caracteres predeterminado utilizado es utf8mb4 que incluye soporte para Emojis. Este problema afecta a las nuevas aplicaciones exclusivelz y, mientras esté ejecutando MySQL> = v5.7.7, no tendrá que hacer nada. Este error suele aparecer en MariaDB o versiones anteriores de MySQL, y se activa específicamente durante las migraciones:

[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))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

La solución para este error no depende de la herramienta en sí (MariaDB) sino de su código. Para evitar esta excepción, como se menciona en la guía de migración oficial de Laravel , solo necesita especificar la longitud predeterminada de las cadenas en su AppServiceProvider simplemente importando la clase Schema y ejecutando el método estático defaultStringLengthde la clase en la bootfunción:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Por ejemplo, en los proyectos predeterminados encontrará este archivo /yourapp/app/Providers/AppServiceProvider.php y, después de los cambios, el archivo debería verse así:

<?php

// . yourapp\app\Providers\AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

// 1. Import Schema
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // 2. Set default string length
        Schema::defaultStringLength(191);
    }

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

Si ejecuta las migraciones una vez más, la excepción ya no debería aparecer.

Que te diviertas ❤️!


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores