web-dev-qa-db-fra.com

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

[Illuminate\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: modification du tableau users ajouter 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.

81
absiddiqueLive

Selon la 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 le montant maximal pour un champ UTF8 de 4 octets, donc avec 255 + 255 avec votre DEFAULT CHARACTER SET. vous avez dépassé la limite de 767 longueur maximale de clé. Par @scaisedge

123
absiddiqueLive

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

Schema::defaultStringLength(191);

dans AppServiceProvider n'a pas fonctionné pour moi . Ce qui a bien fonctionné a été la modification du fichier database.php dans le dossier config . Il suffit de modifier 

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

à 

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

et ça devrait marcher ... Espérons que ça aide.

57
Koushik Das

J'ajoute simplement cette réponse ici car c'est la solutionquickestpour moi. Il suffit de définir le moteur de base de données par défaut sur'InnoDB'on 

/config/database.php

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

puis exécutezphp artisan config:cachepour effacer et actualiser le cache de configuration

32
Dexter Bengil

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);
21
user7688086

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

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

Laravel utilise le jeu de caractères utf8mb4 par défaut, qui inclut support pour stocker "emojis" dans la base de données. Si vous utilisez un version de MySQL antérieure à la version 5.7.7 ou MariaDB antérieure à Dans la version 10.2.2, vous devrez peut-être configurer manuellement le fichier par défaut longueur de chaîne générée par les migrations pour permettre à MySQL de créer index pour eux. Vous pouvez le configurer en appelant le Schema::defaultStringLength méthode dans votre AppServiceProvider.

En d'autres termes, dans <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 commentaire sur l'autre réponse dit:

Attention à cette solution. Si vous indexez les champs de courrier électronique, par exemple, Les e-mails stockés ne peuvent avoir qu'une longueur maximale de 191 caractères. C'est moins que le RFC officiel déclare.

La documentation propose donc également une autre solution:

Vous pouvez également activer l'option innodb_large_prefix pour votre fichier base de données. Reportez-vous à la documentation de votre base de données pour obtenir des instructions sur comment activer correctement cette option.

17
Esteban Herrera

Pour quelqu'un qui ne veut pas changer AppServiceProvider.php. (À mon avis, c'est une mauvaise idée de changer AppServiceProvider.php juste pour la migration)

Vous pouvez rajouter la longueur des données dans le fichier de migration sous database/migrations/ comme ci-dessous:

create_users_table.php

$table->string('name',64);
$table->string('email',128)->unique();

create_password_resets_table.php

$table->string('email',128)->index();
12
helloroy

Ajoutez le code ci-dessous dans la méthode app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

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

vous devez d'abord supprimer (si vous avez) la table users, la table password_resets de la base de données et supprimer les entrées d'utilisateurs et de mot de passe du tableau migrations, puis, après la suppression des anciennes tables, exécuter php artisan migrate commander

6
Udhav Sarvaiya

Au lieu de fixer une limite de longueur, je propose ce qui suit, qui a fonctionné pour moi.

À l'intérieur 

config/database.php

remplace cette ligne pour mysql

'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

upon

'engine' => null,
5

J'ai résolu ce problème et modifié mon fichier config-> database.php pour qu'il ressemble à ma base de données ('charset' => 'utf8') et le ('collation' => 'utf8_general_ci') , donc mon problème est résolu le code comme suit:

'mysql' => [
        'driver' => 'mysql',
        'Host' => env('DB_Host', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_general_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
5
Ahmad Shakib

Comme déjà spécifié, nous ajoutons au fichier AppServiceProvider.php dans App/Providers

use Illuminate\Support\Facades\Schema;  // add this

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191); // also this line
}

vous pouvez voir plus de détails dans le lien ci-dessous (recherche "Index Lengths & MySQL/MariaDB") https://laravel.com/docs/5.5/migrations

MAIS BIEN, ce n’est pas ce que j’ai publié! la chose est même en faisant ce qui précède vous risquez probablement d'obtenir une autre erreur (c'est à ce moment-là que vous exécuterez la commande php artisan migrate et en raison du problème de longueur, l'opération sera probablement bloquée au milieu. la solution est inférieure à, et la table utilisateur est probablement créée sans le reste ou pas totalement correctement) nous devons annuler. la restauration par défaut ne fonctionnera pas. parce que l'opération de migration n'a pas aimé finir. vous devez supprimer manuellement les nouvelles tables créées dans la base de données.

on peut le faire en utilisant bricoler comme ci-dessous:

L:\todos> php artisan tinker

Psy Shell v0.8.15 (PHP 7.1.10 — cli) by Justin Hileman

>>> Schema::drop('users')

=> null

J'ai moi-même eu un problème avec la table des utilisateurs. 

après que vous êtes prêt à partir

php artisan migrate:rollback

php artisan migrate

4
Mohamed Allal

Dans AppServiceProvider.php fichier:

use Illuminate\Support\Facades\Schema;

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

Schema::defaultStringLength(191); définira la longueur de toutes les chaînes 191 par défaut, ce qui peut ruiner votre base de données. Vous ne devez pas aller de cette façon.

Définissez simplement la longueur d'une colonne spécifique dans la classe de migration de la base de données. Par exemple, je définis le "nom", le "nom d'utilisateur" et le "email" dans la classe CreateUsersTable comme ci-dessous:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 191);
            $table->string('username', 30)->unique();
            $table->string('email', 191)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
3
Fatema T. Zuhora

Comme indiqué dans le document Migrations guide pour résoudre ce problème, tout ce que vous avez à faire est de modifier votre fichier app/Providers/AppServiceProvider.php et, dans la méthode de démarrage, définissez une longueur de chaîne par défaut:

use Illuminate\Support\Facades\Schema;

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

Remarque: vous devez d'abord supprimer (si vous avez) la table users, la table password_resets de la base de données et supprimer les utilisateurs et les entrées de mot_passe de migrations.

Pour exécuter toutes vos migrations en attente, exécutez la commande migrate Artisan:

php artisan migrate

Après cela, tout devrait fonctionner normalement.

3
user9162235

J'ajoute deux sollution qui fonctionnent pour moi.

_ {1st sollution is : 

  1. Ouvrez le dossier database.php _ file insde config dir /.
  2. Éditer 'engine' => null, en 'engine' => 'InnoDB',

    Cela a fonctionné pour moi.

_ {La seconde demande est:} _

  1. Ouvrez le dossier database.php _ file insde config dir /.
    2 .Éditer
    'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
    à 

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


Bonne chance

3
Arslan Ahmad

Ceci est courant depuis que Laravel 5.4 a modifié le jeu de caractères de base de données par défaut en utf8mb4. Ce que vous devez faire, c'est: éditez votre App\Providers.php en mettant ce code avant la déclaration de classe

use Illuminate\Support\Facades\Schema;

Ajoutez également ceci à la fonction 'boot' Schema::defaultStringLength(191);

2
Treasure

Je viens de modifier la ligne suivante dansusersetpassword_resetsfichier de migration.

Ancien: $table->string('email')->unique();

Nouveau: $table->string('email', 128)->unique();

Voila !!

2
Mahesh Gaikwad

Comme indiqué dans le guide Migrations pour résoudre ce problème, il vous suffit de modifier votre fichier AppServiceProvider.php et, dans la méthode de démarrage, définissez une longueur de chaîne par défaut:

//edit your AppServiceProvider.php file contains in providers folder
use Illuminate\Support\Facades\Schema;

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

J'espère que cela vous aidera. Cheers ..

2
Rohit Saini

mettre à jour et insérer ces lignes dans app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema;  //insert this line
public function boot()
{
    Schema::defaultStringLength(191); //insert this line also
}

configurez votre moteur de base de données dans config/database.php dans le tableau 'mysql'

'engine' => 'InnoDB',
2
Anjani Barnwal

Si aucune base de données ne vous a déjà été attribuée, procédez comme suit:

  1. Allez à app/Providers/AppServiceProvide.php et ajoutez

utilisez Illuminate\Support\ServiceProvider;

et à l'intérieur de la méthode boot ();

Schema :: defaultStringLength (191);

  1. Supprimez maintenant les enregistrements de votre base de données, la table utilisateur par ex.

  2. lancer le suivant

php artisan config: cache

php artisan migrer

2
Levinski Polish

Si vous souhaitez modifier AppServiceProvider, vous devez définir la longueur du champ de courrier électronique dans la migration. remplacez simplement la première ligne de code par la deuxième ligne.

create_users_table 

$table->string('email')->unique();
$table->string('email', 50)->unique();

create_password_resets_table

$table->string('email')->index();
$table->string('email', 50)->index();

Une fois les modifications apportées, vous pouvez exécuter la migration.
Remarque: vous devez d’abord supprimer (si vous avez) la table users, la table password_resets de la base de données et supprimer les entrées user et password_resets du tableau de migration.

2
chintan kotadiya

1- Aller à/config/database.phpet trouver ces lignes

'mysql' => [
    ...,
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    ...,
    'engine' => null,
 ]

et les changer pour:

'mysql' => [
    ...,
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    ...,
    'engine' => 'InnoDB',
 ]

2- Runphp artisan config:cachepour reconfigurer laravel

3- Supprimez les tables existantes de votre base de données, puis exécutezphp artisan migrateà nouveau.

1
mohammad asghari

La solution recommandée consiste à activer l'option innodb_large_prefix de MySQL afin d'éviter les problèmes ultérieurs. Et voici comment faire cela:

Ouvrez le fichier de configuration MySQL my.ini et ajoutez les lignes ci-dessous sous la ligne [mysqld] comme ceci.

[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON

Après cela, enregistrez vos modifications et redémarrez votre service MySQL.

Effectuez une restauration si vous en avez besoin, puis réexécutez votre migration.


Au cas où votre problème persisterait, accédez au fichier de configuration de votre base de données et définissez-le. 

'engine' => null, à 'engine' => 'innodb row_format=dynamic'

J'espère que ça aide!

1
Sammie

Afin de (éviter de changer quoi que ce soit dans votre code}, simplement mettez à jour votre serveur MySQL vers au moins 5.7.7 

Référence cette référence pour plus d'informations: https://laravel-news.com/laravel-5-4-key-too-long-error

1
F.E Noel Nfebe

Je pense que forcer StringLenght à 191 est une très mauvaise idée… Donc, je cherche à comprendre ce qui se passe.

J'ai remarqué que ce message d'erreur:

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

Commencé à apparaître après avoir mis à jour ma version de MySQL. J'ai donc vérifié les tables avec PHPMyAdmin et j'ai remarqué que toutes les nouvelles tables créées le faisaient avec la collation utf8mb4_unicode_ci au lieu de utf8_unicode_ci pour les anciennes.

Dans mon fichier de configuration de la doctrine, j'ai remarqué que charset était défini sur utf8mb4, mais toutes mes tables précédentes avaient été créées dans utf8. Je suppose donc que c'est une magie de mise à jour qui commence à fonctionner sur utf8mb4.

Maintenant, la solution la plus simple consiste à modifier le jeu de caractères de ligne dans votre fichier de configuration ORM . Ensuite, supprimez les tables à l’aide de utf8mb4_unicode_ci si vous êtes en mode dev ou fixez le jeu de caractères si vous ne pouvez pas les supprimer.

Pour Symfony 4 

change charset: utf8mb4 en charset: utf8 dans config/packages/doctrine.yaml

Maintenant, ma doctrine les migrations fonctionnent à nouveau très bien.

1
Kaizoku Gambare

Le travail abordé ici était de passer un deuxième paramètre avec le nom de clé (un nom court):

$table->string('my_field_name')->unique(null,'key_name');
0
Tiago Gouvêa

Pour tous ceux qui pourraient être confrontés à cette situation, mon problème était que je créais une colonne de type string et que je tentais de la créer ->unsigned() alors que je voulais qu'elle soit un entier. 

0
Brynn Bateman

commencez par supprimer toutes les tables de la base de données dans l'hôte local

Remplacez les propriétés de la base de données Laravel default (utf8mb4) dans le fichier config/database.php par:

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

after then Modification de mes propriétés de base de données locales utf8_unicode_ci. php artisan migrate c'est ok.

0
Goldman.Vahdettin

Changer mon type de serveur de base de données local de "mariadb" à "mysql" a corrigé cela pour moi sans avoir à modifier aucun fichier Laravel.

J'ai suivi ce tutoriel pour changer le type de mon serveur de base de données: https://odan.github.io/2017/08/13/xampp-replacing-mariadb-with-mysql.html

0
Adam Winster

Je recevais cette erreur même si j'avais déjà (en fait parce que j'avais déjà) Schema :: defaultStringLength (191); dans mon fichier AppServiceProvider.php.

La raison en est que j'essayais de définir une valeur de chaîne dans l'une de mes migrations sur une valeur supérieure à 191:

Schema::create('order_items', function (Blueprint $table) {
    $table->primary(['order_id', 'product_id', 'attributes']);
    $table->unsignedBigInteger('order_id');
    $table->unsignedBigInteger('product_id');
    $table->string('attributes', 1000); // This line right here
    $table->timestamps();
});

Supprimer le 1000 ou le régler sur 191 a résolu mon problème.

0
Jacey

Vous pouvez définir une longueur de chaîne du champ indexé comme suit:

  $table->string('email', 200)->unique();
0
Smith

Pour Lumen:

Ajouter au fichier .env

DB_ENGINE=InnoDB
0
Scotty G