137 votes

Erreur de migration Laravel : Erreur de syntaxe ou violation d'accès : 1071 La clé spécifiée était trop longue ; la longueur maximale de la clé est de 767 octets.

Erreur de migration sur Laravel 5.4 avec php artisan make:auth

[Illuminez \Database\QueryException ] SQLSTATE[42000] : Erreur de syntaxe ou violation d'accès : 1071 La clé spécifiée était trop longue ; la longueur maximale de la clé est de 767 octets (SQL : alter tabl e users ajouter un élément unique users_email_unique ( email ))

[PDOException] SQLSTATE[42000]: Erreur de syntaxe ou violation d'accès : 1071 La clé spécifiée était trop longue ; la longueur maximale de la clé est de 767 octets.

216voto

Broken_Mirror Points 151

Selon le documentation officielle vous pouvez résoudre ce problème assez facilement.

Ajoutez le code suivant à AppServiceProvider.php (/app/Providers/AppServiceProvider.php)

use Illuminate\Support\Facades\Schema; //NEW: Import Schema

function boot()
{
    Schema::defaultStringLength(191); //NEW: Increase StringLength
}

MySQL réserve toujours la quantité maximale pour un champ UTF8 qui est de 4 octets donc avec 255 + 255 avec votre DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ; vous dépassez la limite de 767 de longueur de clé maximale. Par @scaisedge

98voto

Koushik Das Points 1858

Je ne sais pas pourquoi la solution ci-dessus et la solution officielle qui ajoute

Schema::defaultStringLength(191);

sur AppServiceProvider n'a pas fonctionné pour moi. Ce qui a marché pour moi, c'est d'éditer le database.php dans config dossier. Il suffit de modifier

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

à

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

et cela devrait fonctionner. J'espère que cela vous aidera.

66voto

dexterb Points 1881

J'ajoute juste cette réponse ici car c'est la quickest solution pour moi. Il suffit de définir le moteur de base de données par défaut à 'InnoDB' sur

/config/database.php

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

puis exécutez php artisan config:cache pour effacer et rafraîchir le cache de configuration

34voto

user7688086 Points 221

Dans le AppServiceProvider.php ,vous incluez ce code en haut du fichier.

use Illuminate\Support\Facades\Schema;

Et vous ajoutez ce code dans la méthode de démarrage.

 Schema::defaultStringLength(191);

21voto

Esteban Herrera Points 899

Ce problème est causé dans Laravel 5.4 par la version de la base de données.

Selon le docs (dans le Index Lengths & MySQL / MariaDB section) :

Laravel utilise le utf8mb4 par défaut, qui comprend prise en charge du stockage des "emojis" dans la base de données. Si vous exécutez une version de MySQL plus ancienne que la version 5.7.7 ou de MariaDB plus ancienne que la version 10.2.2, vous devrez peut-être configurer manuellement la longueur par par défaut générée par les migrations pour que MySQL puisse créer des pour elles. Vous pouvez configurer cela en appelant la fonction Schema::defaultStringLength à l'intérieur de votre AppServiceProvider .

En d'autres termes, en <ROOT>/app/Providers/AppServiceProvider.php :

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

class AppServiceProvider extends ServiceProvider
{

public function boot()
{
    // Add the following line
    Schema::defaultStringLength(191);
}

// ...

}

Mais comme le dit le commentaire de l'autre réponse :

Soyez prudent avec cette solution. Si vous indexez des champs d'email par exemple, les emails stockés ne peuvent avoir qu'une longueur maximale de 191 caractères. C'est moins que ce qu'indique le RFC officiel.

La documentation propose donc également une autre solution :

Alternativement, vous pouvez activer l'option innodb_large_prefix pour votre base de données. Consultez la documentation de votre base de données pour savoir comment comment activer correctement cette option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X