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: alter table
users
add uniqueusers_email_unique
([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
Réponses:
Selon la documentation officielle , vous pouvez résoudre ce problème assez facilement.
Ajoutez les deux lignes de code suivantes à AppServiceProvider.php (/app/Providers/AppServiceProvider.php)
la source
Je ne sais pas pourquoi la solution ci-dessus et la solution officielle qui ajoute
en
AppServiceProvider
n'a pas fonctionné pour moi. Ce qui fonctionnait, c'était l'édition dudatabase.php
fichier dans leconfig
dossier. Modifiez simplementà
et cela devrait fonctionner, même si vous ne pourrez pas stocker de caractères multi-octets étendus comme les emoji .
Je l'ai fait avec Laravel 5.7. J'espère que ça aide.
la source
use Illuminate\Support\Facades\Schema;
au sommet.utf8mb4
classement est là pour une raison, je recommande de l'utiliser si vous le pouvez.J'ajoute simplement cette réponse ici car c'est la
quickest
solution pour moi. Réglez simplement le moteur de base de données par défaut'InnoDB'
sur on/config/database.php
puis exécutez
php artisan config:cache
pour effacer et actualiser le cache de configurationla source
Dans le
AppServiceProvider.php
, vous incluez ce code en haut du fichier.la source
Ce problème est causé dans Laravel 5.4 par la version de la base de données.
Selon la documentation (dans la
Index Lengths & MySQL / MariaDB
section):En d'autres termes, en
<ROOT>/app/Providers/AppServiceProvider.php
:Mais comme le dit le commentaire sur l'autre réponse:
La documentation propose donc également une autre solution:
la source
Pour quelqu'un qui ne veut pas changer
AppServiceProvider.php
. (À mon avis, c'est une mauvaise idée de changerAppServiceProvider.php
juste pour la migration)Vous pouvez rajouter la longueur des données au fichier de migration
database/migrations/
comme ci-dessous:create_users_table.php
create_password_resets_table.php
la source
Si vous rencontrez cette erreur pendant que vous travaillez sur laravel en utilisant la commande:
php artisan migrate
alors vous ajoutez simplement 2 lignes dans le fichier: app-> Providers-> AppServiceProvider.phpuse Schema;
Schema::defaultStringLength(191);
veuillez vérifier cette image . puis exécutez à
php artisan migrate
nouveau la commande.la source
\Schema::defaultStringLength(191);
J'ajoute deux solutions qui fonctionnent pour moi.
La 1ère sollution est :
Éditer
'engine' => null,
vers'engine' => 'InnoDB',
Cela a fonctionné pour moi.
La 2ème sollution est:
Ouvrez database.php fichier insde config dir / dossier.
2. Modifier
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
en
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Bonne chance
la source
mettre à jour et insérer ces lignes dans app / Providers / AppServiceProvider.php
la source
J'ai résolu ce problème et modifié mon fichier config-> database.php pour aimer ma base de données ('charset' => 'utf8') et le ('collation' => 'utf8_general_ci') , donc mon problème est résolu le code comme suivre:
la source
J'ai trouvé deux solutions à cette erreur
OPTION 1:
Ouvrez votre table user et password_reset dans le dossier database / migrations
Et changez simplement la longueur de l'e-mail:
OPTION 2:
Ouvrez votre
app/Providers/AppServiceProvider.php
fichier et à l'intérieur de laboot()
méthode définissez une longueur de chaîne par défaut:la source
1- Allez
/config/database.php
et trouvez ces ligneset changez-les en:
2- Courir
php artisan config:cache
pour reconfigurer laravel3- Supprimer les tables existantes dans votre base de données, puis exécutez à
php artisan migrate
nouveaula source
Dans le fichier AppServiceProvider.php :
la source
Au lieu de fixer une limite de longueur, je proposerais ce qui suit, qui a fonctionné pour moi.
À l'intérieur:
remplacez cette ligne pour mysql:
avec:
la source
Comme indiqué dans le guide Migrations pour résoudre ce problème, tout ce que vous avez à faire est de modifier votre
app/Providers/AppServiceProvider.php
fichier et, dans la méthode de démarrage, définissez une longueur de chaîne par défaut:Remarque: vous devez d'abord supprimer (si vous en avez) la table users, la table password_resets de la base de données et supprimer les entrées users et password_resets des migrations table des .
Pour exécuter toutes vos migrations en cours, exécutez la
migrate
commande Artisan:Après cela, tout devrait fonctionner normalement.
la source
Comme déjà spécifié, nous ajoutons à AppServiceProvider.php dans App / Providers
vous pouvez voir plus de détails dans le lien ci-dessous (recherchez "Index Lengths & MySQL / MariaDB") https://laravel.com/docs/5.5/migrations
MAIS BIEN, ce n'est pas ce que j'ai publié! le problème est que même en faisant ce qui précède, vous obtiendrez probablement une autre erreur (c'est lorsque vous exécutez la
php artisan migrate
commande et en raison du problème de longueur, l'opération sera probablement bloquée au milieu. La solution est ci-dessous , et la table utilisateur est probablement créée sans le reste ou pas totalement correctement) nous devons reculer . la restauration par défaut ne fonctionnera pas. car l'opération de migration n'aimait pas la finition. vous devez supprimer manuellement les nouvelles tables créées dans la base de données.nous pouvons le faire en utilisant bricoler comme ci-dessous:
J'ai moi-même eu un problème avec la table des utilisateurs.
après ça tu es prêt à partir
php artisan migrate:rollback
php artisan migrate
la source
La solution que personne ne dit est que dans Mysql v5.5 et versions ultérieures, InnoDB est le moteur de stockage par défaut qui n'a pas ce problème, mais dans de nombreux cas, comme le mien, il existe d'anciens fichiers de configuration mysql ini qui utilisent l'ancien moteur de stockage MYISAM comme ci-dessous.
ce qui crée tous ces problèmes et la solution est de changer une fois pour toutes le moteur de stockage par défaut en InnoDB dans le fichier de configuration ini de Mysql au lieu de faire des hacks temporaires.
Et si vous êtes sur MySql v5.5 ou version ultérieure, InnoDB est le moteur par défaut, vous n'avez donc pas besoin de le définir explicitement comme ci-dessus, supprimez simplement le
default-storage-engine=MYISAM
s'il existe de votreini
fichier et vous êtes prêt à partir.la source
show global variables like 'innodb_large_prefix';
elle devrait être activée . S'il est désactivé, vous pouvez vérifier cette réponse pour savoir comment l'activer. Et voici plus d'informations sur innodb_large_prefix sur dev.mysql.com.Si vous souhaitez modifier AppServiceProvider, vous devez définir la longueur du champ d'e-mail lors de la migration. remplacez simplement la première ligne de code par la deuxième ligne.
create_users_table
create_password_resets_table
Une fois les modifications effectuées, vous pouvez exécuter la migration.
Remarque: vous devez d'abord supprimer (si vous avez) table d'utilisateurs , table password_resets de la base de données et d' utilisateurs supprimer et password_resets entrées de la table de migration.
la source
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 suivre cette voie.Définissez simplement la longueur d'une colonne spécifique dans la classe de migration de base de données. Par exemple, je définis le "nom", "username" et "email" dans la
CreateUsersTable
classe comme ci-dessous:la source
Ceci est courant depuis que Laravel 5.4 a changé le jeu de caractères de base de données par défaut en utf8mb4. Ce que vous devez faire, c'est: éditer votre App \ Providers.php en mettant ce code avant la déclaration de classe
Ajoutez également ceci à la fonction 'boot'
Schema::defaultStringLength(191);
la source
Si aucune donnée n'est déjà affectée à votre base de données, procédez comme suit:
et à l'intérieur de la méthode boot ();
Supprimez maintenant les enregistrements de votre base de données, table utilisateur par exemple.
exécuter ce qui suit
la source
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
est déjà là. J'espère que vous le corrigezComme indiqué dans le guide Migrations pour résoudre ce problème, tout ce que vous avez à faire est de modifier votre fichier AppServiceProvider.php et, dans la méthode de démarrage, définissez une longueur de chaîne par défaut:
J'espère que cela vous aidera ...
la source
Je viens de modifier la ligne suivante
users
et lepassword_resets
fichier de migration.Vieux :
$table->string('email')->unique();
Nouveau :
$table->string('email', 128)->unique();
la source
Afin d' éviter de changer quoi que ce soit dans votre code , mettez simplement à jour votre serveur MySQL à au moins 5.7.7
Référencez-le pour plus d'informations: https://laravel-news.com/laravel-5-4-key-too-long-error
la source
Je pense que forcer StringLenght à 191 est une très mauvaise idée. Alors j'enquête pour comprendre ce qui se passe.
J'ai remarqué que cette erreur de message:
J'ai 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 étaient avec la collation utf8mb4_unicode_ci au lieu de utf8_unicode_ci pour les anciennes.
Dans mon fichier de configuration de doctrine, j'ai remarqué que charset était défini sur utf8mb4, mais toutes mes tables précédentes ont été créées dans utf8, donc je suppose que c'est une magie de mise à jour qui commence à fonctionner sur utf8mb4.
La solution la plus simple consiste maintenant à modifier le jeu de caractères de ligne dans votre fichier de configuration ORM. Ensuite, supprimez les tables en utilisant utf8mb4_unicode_ci si vous êtes en mode dev ou corrigez le jeu de caractères si vous ne pouvez pas les supprimer.
Pour Symfony 4
Maintenant, mes migrations de doctrine fonctionnent à nouveau très bien.
la source
La solution recommandée est d'activer l'
innodb_large_prefix
option MySQL pour ne pas avoir de problèmes ultérieurs. Et voici comment faire cela:Ouvrez le
my.ini
fichier de configuration MySQL et ajoutez les lignes ci-dessous sous la[mysqld]
ligne comme ceci.Après cela, enregistrez vos modifications et redémarrez votre service MySQL.
Annulez si vous en avez besoin, puis réexécutez votre migration.
Au cas où votre problème persiste, accédez au fichier de configuration de votre base de données et définissez
'engine' => null,
à'engine' => 'innodb row_format=dynamic'
J'espère que ça aide!
la source
supprimez d'abord toutes les tables de la base de données dans l'hôte local
Modifiez les propriétés de la base de données par défaut de Laravel (utf8mb4) dans le fichier config / database.php en:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
après avoir changé les propriétés de ma base de données locale utf8_unicode_ci. php artisan migrer c'est ok.
la source
Pour tous ceux qui pourraient rencontrer cela, mon problème était que je créais une colonne de type
string
et que j'essayais de la créer->unsigned()
alors que je voulais que ce soit un entier.la source
L'approche qui fonctionne ici était de passer un deuxième paramètre avec le nom de la clé (un court):
la source
J'obtenais 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:
La suppression du 1000 ou le réglage sur 191 a résolu mon problème.
la source