Skip to main content

Specified key was too long

Escenario

Despliegue de una app de laravel en un servidor. Ejecutamos el primer migrate y zas.

php artisan migrate
...
 Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
...

No nos asustemos; el tema está en una diferencia de versión MySQL

ATENCIÓN a programadores cada vez las diferencias entre versiones de un mismo motor son fuertes (MySQL 5.X vs MySQL 8, por ejemplo), MySQL vs MariaDB vs Percona. Algunas pueden producir serios problemas en caso de tener que recuperar un backup de otro motor o versión, o una configuración.

Posibles soluciones

Actualización del motor de Base de Datos

Si es posible lo adecuado, es que uses el mismo motor tanto en desarrollo, testing y producción. Y la misma configuración.

Tener apps profesionales, en un entorno compartido, es como ser un feriante (con respeto a su profesión). Sufriras, tu tienda o negocio no tendrá el aspecto que tendrías en un servidor dedicado o VPS, optimizado para tu negocio

Modificación del engine en tu app

Si te es imposible o no quieres actualizar tu monotr de bases de datos, intenta modificar el engine de mysql en el archivo config/database.php

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

Modificación del AppServiceProvider

Si no te funciona la anterior, puede agregar una linea en tu fichero app/Providers/AppServiceProvider.php

...
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
...

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

Explicación

La naturaleza del problema es debido a que por defecto Laravel usa como codificación utf8mb4, con soporte para los emojis.

Enlaces y cosas sobre el tema

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.