Migrationsfehler auf Laravel 5.4 mit php artisan make:auth
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1071 Der angegebene Schlüssel war zu lang. Die maximale Schlüssellänge beträgt 767 Byte (SQL: alter tabl e
users
add uniqueusers_email_unique
([PDOException] SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1071 Der angegebene Schlüssel war zu lang. Die maximale Schlüssellänge beträgt 767 Byte
Antworten:
Laut offizieller Dokumentation können Sie dies ganz einfach lösen.
Fügen Sie AppServiceProvider.php die folgenden zwei Codezeilen hinzu (/app/Providers/AppServiceProvider.php)
quelle
Ich weiß nicht, warum die obige Lösung und die offizielle Lösung, die hinzugefügt wird
in
AppServiceProvider
hat bei mir nicht funktioniert. Was funktionierte, war das Bearbeiten derdatabase.php
Datei imconfig
Ordner. Einfach bearbeitenzu
und es sollte funktionieren, obwohl Sie keine erweiterten Multibyte-Zeichen wie Emoji speichern können .
Ich habe es mit Laravel 5.7 gemacht. Ich hoffe es hilft.
quelle
use Illuminate\Support\Facades\Schema;
oben verpasst .utf8mb4
Zusammenstellung ist aus einem bestimmten Grund vorhanden. Ich empfehle, sie zu verwenden, wenn Sie können.Ich füge hier nur diese Antwort hinzu, da dies die
quickest
Lösung für mich ist. Setzen Sie einfach das Standard-Datenbankmodul'InnoDB'
auf Ein/config/database.php
Führen Sie dann aus
php artisan config:cache
, um den Konfigurationscache zu löschen und zu aktualisierenquelle
In der
AppServiceProvider.php
fügen Sie diesen Code oben in die Datei ein.quelle
Dieses Problem wird in Laravel 5.4 durch die Datenbankversion verursacht.
Gemäß den Dokumenten (im
Index Lengths & MySQL / MariaDB
Abschnitt):Mit anderen Worten, in
<ROOT>/app/Providers/AppServiceProvider.php
:Aber wie der Kommentar zur anderen Antwort sagt:
Die Dokumentation schlägt also auch eine andere Lösung vor:
quelle
Für jemanden, der sich nicht ändern will
AppServiceProvider.php
. (Meiner Meinung nach ist es eine schlechte Idee,AppServiceProvider.php
nur für die Migration zu ändern )Sie können die Datenlänge wie folgt zur Migrationsdatei hinzufügen
database/migrations/
:create_users_table.php
create_password_resets_table.php
quelle
Wenn dieser Fehler bei der Arbeit an Laravel während der Verwendung des Befehls auftritt,
php artisan migrate
fügen Sie der Datei einfach zwei Zeilen hinzu: app-> Providers-> AppServiceProvider.phpuse Schema;
Schema::defaultStringLength(191);
Bitte überprüfen Sie dieses Bild . Führen Sie dann den
php artisan migrate
Befehl erneut aus.quelle
\Schema::defaultStringLength(191);
Ich füge zwei Sollutionen hinzu , die für mich funktionieren.
1. sollution ist :
Bearbeiten
'engine' => null,
zu'engine' => 'InnoDB',
Das hat bei mir funktioniert.
2. sollution ist:
Öffnen database.php Datei insde config - dir / Ordner.
2. Bearbeiten
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
auf
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Viel Glück
quelle
Aktualisieren und fügen Sie diese Zeilen in app / Providers / AppServiceProvider.php ein
quelle
Ich habe dieses Problem gelöst und meine Datei config-> database.php so bearbeitet, dass sie meiner Datenbank ('charset' => 'utf8') und der ('collation' => 'utf8_general_ci') entspricht , sodass mein Problem mit dem Code als gelöst ist Folgen:
quelle
Ich habe zwei Lösungen für diesen Fehler gefunden
OPTION 1:
Öffnen Sie Ihre Tabelle user und password_reset im Ordner database / migrations
Und ändern Sie einfach die Länge der E-Mail:
OPTION 2:
Öffnen Sie Ihre
app/Providers/AppServiceProvider.php
Datei undboot()
legen Sie innerhalb der Methode eine Standardzeichenfolgenlänge fest:quelle
1- Gehen Sie zu
/config/database.php
und finden Sie diese Zeilenund ändern Sie sie zu:
2- Führen Sie
php artisan config:cache
diese Option aus, um die Laravel neu zu konfigurieren3- Löschen Sie die vorhandenen Tabellen in Ihrer Datenbank und führen Sie sie
php artisan migrate
erneut ausquelle
In der Datei AppServiceProvider.php :
quelle
Anstatt eine Längenbeschränkung festzulegen, würde ich Folgendes vorschlagen, was für mich funktioniert hat.
Innerhalb:
Ersetzen Sie diese Zeile für MySQL:
mit:
quelle
Wie in dem Migrations skizzierte führen , dies zu beheben, alles , was Sie tun müssen, ist Ihre bearbeiten
app/Providers/AppServiceProvider.php
Datei und in der Boot - Methode eingestellte Länge einer Standardzeichenfolge:Hinweis: Zuerst müssen Sie die Benutzertabelle, die Tabelle password_resets aus der Datenbank löschen (falls vorhanden) und die Einträge user und password_resets aus der Migrationstabelle löschen .
Führen Sie den
migrate
Befehl Artisan aus , um alle ausstehenden Migrationen auszuführen :Danach sollte alles wie gewohnt funktionieren.
quelle
Wie bereits angegeben, fügen wir der AppServiceProvider.php in App / Providers hinzu
Weitere Details finden Sie im folgenden Link (Suche nach "Indexlängen & MySQL / MariaDB") https://laravel.com/docs/5.5/migrations
ABER GUT, darüber habe ich nicht alles veröffentlicht! Selbst wenn Sie die oben genannten Schritte ausführen, wird wahrscheinlich ein weiterer Fehler angezeigt (wenn Sie den
php artisan migrate
Befehl ausführen und aufgrund des Problems der Länge der Vorgang wahrscheinlich in der Mitte hängen bleibt. Die Lösung befindet sich unten und die Benutzertabelle wird wahrscheinlich erstellt ohne den Rest oder nicht ganz richtig) müssen wir zurückrollen . Das Standard-Rollback funktioniert nicht. weil der Vorgang der Migration nicht gerne beendet wurde. Sie müssen die neu erstellten Tabellen in der Datenbank manuell löschen.wir können es mit basteln wie unten machen:
Ich selbst hatte ein Problem mit der Benutzertabelle.
Danach können Sie loslegen
php artisan migrate:rollback
php artisan migrate
quelle
Die Lösung, die niemand sagt, ist, dass InnoDB in MySQL v5.5 und höher die Standard-Speicher-Engine ist, die dieses Problem nicht hat, aber in vielen Fällen wie meinen gibt es einige alte MySQL-INI- Konfigurationsdateien, die die alte MYISAM- Speicher-Engine wie unten verwenden.
die all diese Probleme schafft und die Lösung zu ändern default-storage-Engine InnoDB in der der Mysql ini - Konfigurationsdatei ein für alle Mal statt temporäre Hacks zu tun.
Und wenn Sie mit MySql v5.5 oder höher arbeiten, ist InnoDB die Standard-Engine, sodass Sie es nicht explizit wie oben festlegen müssen. Entfernen
default-storage-engine=MYISAM
Sie einfach das, wenn es in Ihrerini
Datei vorhanden ist, und Sie können loslegen.quelle
show global variables like 'innodb_large_prefix';
sollte es sein , ON . Wenn es OFF dann können Sie überprüfen , diese Antwort, wie man es einschalten. Und hier ist mehr Informationen über innodb_large_prefix auf dev.mysql.com.Wenn Sie in AppServiceProvider ändern möchten, müssen Sie die Länge des E-Mail-Felds bei der Migration definieren. Ersetzen Sie einfach die erste Codezeile durch die zweite.
create_users_table
create_password_resets_table
Nach erfolgreichen Änderungen können Sie die Migration ausführen.
Hinweis: Zuerst müssen Sie löschen (wenn Sie haben) Benutzer - Tabelle , password_resets Tabelle aus der Datenbank und löschen Benutzer und password_resets Einträge aus Migrationstabelle.
quelle
Schema::defaultStringLength(191);
definiert standardmäßig die Länge aller Zeichenfolgen 191, die Ihre Datenbank ruinieren können. Du darfst diesen Weg nicht gehen.Definieren Sie einfach die Länge einer bestimmten Spalte in der Datenbankmigrationsklasse. Zum Beispiel definiere ich den "Namen", "Benutzernamen" und "E-Mail" in der
CreateUsersTable
Klasse wie folgt:quelle
Dies ist häufig der Fall, da Laravel 5.4 den Standard-Datenbankcharater auf utf8mb4 geändert hat. Was Sie tun müssen, ist: Bearbeiten Sie Ihre App \ Providers.php, indem Sie diesen Code vor die Klassendeklaration setzen
Fügen Sie dies auch der Boot-Funktion hinzu
Schema::defaultStringLength(191);
quelle
Wenn Ihrer Datenbank noch keine Daten zugewiesen sind, gehen Sie wie folgt vor:
und innerhalb der Methode boot ();
Löschen Sie nun die Datensätze in Ihrer Datenbank, z. B. Benutzertabelle.
Führen Sie Folgendes aus
quelle
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
ist bereits da.Wie im Migrationshandbuch beschrieben, müssen Sie lediglich Ihre AppServiceProvider.php-Datei bearbeiten und innerhalb der Startmethode eine Standardzeichenfolgenlänge festlegen:
Hoffe das wird dir helfen..cheers ..
quelle
Ich habe gerade die folgende Zeile in
users
undpassword_resets
Migrationsdatei geändert .Alt :
$table->string('email')->unique();
Neu :
$table->string('email', 128)->unique();
quelle
Um Änderungen an Ihrem Code zu vermeiden , aktualisieren Sie einfach Ihren MySQL-Server auf mindestens 5.7.7
Weitere Informationen finden Sie hier: https://laravel-news.com/laravel-5-4-key-too-long-error
quelle
Ich denke, StringLenght auf 191 zu zwingen, ist eine wirklich schlechte Idee. Also untersuche ich, um zu verstehen, was los ist.
Ich habe festgestellt, dass diese Meldung Fehler:
Wurde angezeigt, nachdem ich meine MySQL-Version aktualisiert habe. Also habe ich die Tabellen mit PHPMyAdmin überprüft und festgestellt, dass alle neu erstellten Tabellen mit der Sortierung utf8mb4_unicode_ci anstelle von utf8_unicode_ci für die alten Tabellen erstellt wurden .
In meiner Doctrine-Konfigurationsdatei habe ich festgestellt, dass der Zeichensatz auf utf8mb4 festgelegt wurde, aber alle meine vorherigen Tabellen in utf8 erstellt wurden. Ich denke, dies ist eine Update-Magie, die auf utf8mb4 funktioniert.
Die einfache Lösung besteht nun darin, den Zeilenzeichensatz in Ihrer ORM-Konfigurationsdatei zu ändern. Löschen Sie dann die Tabellen mit utf8mb4_unicode_ci, wenn Sie sich im Entwicklungsmodus befinden, oder korrigieren Sie den Zeichensatz, wenn Sie sie nicht löschen können.
Für Symfony 4
Jetzt funktionieren meine Doktrinenmigrationen wieder einwandfrei.
quelle
Die empfohlene Lösung besteht darin, die
innodb_large_prefix
Option von MySQL zu aktivieren, damit Sie nicht auf nachfolgende Probleme stoßen. Und so geht's:Öffnen Sie die
my.ini
MySQL-Konfigurationsdatei und fügen Sie die folgenden Zeilen unter der folgenden[mysqld]
Zeile hinzu.Speichern Sie danach Ihre Änderungen und starten Sie Ihren MySQL-Dienst neu.
Führen Sie bei Bedarf ein Rollback durch und führen Sie die Migration erneut aus.
Nur für den Fall, dass Ihr Problem weiterhin besteht, gehen Sie zu Ihrer Datenbankkonfigurationsdatei und legen Sie fest
'engine' => null,
zu'engine' => 'innodb row_format=dynamic'
Ich hoffe es hilft!
quelle
Löschen Sie zuerst alle Tabellen der Datenbank im localhost
Ändern Sie die Eigenschaften der Laravel-Standarddatenbank (utf8mb4) in der Datei config / database.php in:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
danach Ändern meiner lokalen Datenbankeigenschaften utf8_unicode_ci. PHP Handwerker migrieren es ist in Ordnung.
quelle
Für alle anderen, die darauf stoßen könnten, bestand mein Problem darin, dass ich eine Spalte vom Typ erstellte
string
und versuchte,->unsigned()
sie zu erstellen , wenn ich beabsichtigte, dass es sich um eine Ganzzahl handelt.quelle
Die hier angesprochene Arbeit bestand darin, einen zweiten Parameter mit dem Schlüsselnamen (einen kurzen) zu übergeben:
quelle
Ich habe diesen Fehler erhalten, obwohl ich bereits Schema :: defaultStringLength (191) hatte (eigentlich, weil ich es bereits hatte); in meiner AppServiceProvider.php-Datei.
Der Grund dafür ist, dass ich versucht habe, bei einer meiner Migrationen einen Zeichenfolgenwert auf einen Wert über 191 festzulegen:
Das Entfernen des 1000 oder das Setzen auf 191 löste mein Problem.
quelle