13 de febrero de 2023

Cómo solucionar el error "Specified key was too long" en Laravel (3 soluciones)

Foto de Marco Orta Marco Orta | 2 min de lectura
Compartir
Mensaje de error de MySQL "Specified key was too long" en la consola de Laravel durante migraciones
Tabla de Contenidos

    ⚙️ Nota 2026: si estás usando MySQL 8 o MariaDB 10.5+ con un Laravel 9 o superior, ya no deberías ver este error en proyectos nuevos: el charset por defecto es utf8mb4 con innodb_default_row_format=DYNAMIC, y los índices ya soportan hasta 3072 bytes. El artículo sigue siendo útil si trabajas con bases de datos heredadas, servidores antiguos o hostings compartidos que aún corren MySQL 5.6/5.7 o MariaDB 10.1.

    En cuántas ocasiones has instalado un nuevo proyecto en Laravel y al momento de correr las migraciones te has encontrado con un error en tu consola:

    [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
    

    Podemos solucionarlo de 3 formas:

    Solución 1

    Si utilizas MariaDB o versiones anteriores de MySQL v5.7.7 simplemente actualiza a la versión estable más reciente y no volverás a tener este problema.

    Solución 2

    Si no puedes o no quieres actualizar MySQL, intenta modificando el engine de mysql en el archivoconfig/database.php

    'mysql' => [
        ...
        'engine' => 'InnoDB',
    ]
    

    Solución 3

    Si por algún motivo no te funciona la solución 2, agrega la siguiente línea al archivo app/Providers/AppServiceProvider.php

    use Illuminate\Support\Facades\Schema;
    
    public function boot()
    {
        Schema::defaultStringLength(191);
    }
    

    ¿Por qué ocurre este error?

    Desde la versión 5.4 de Laravel se realizó un cambio en el conjunto de caracteres predeterminado de la base de datos, y ahora es utf8mb4, que incluye soporte para almacenar emojis. Esto solo afecta a las aplicaciones que utilicen versiones anteriores a MySQL v5.7.7

    Compartir

    Buscar

    Etiquetas

    IA Tutorial Laravel PHP JavaScript Desarrollo Web Buenas Prácticas Migración Laravel 13 SEO Claude Herramientas Seguridad OpenAI MCP