Ich versuche, eine Benutzertabelle in Laravel zu migrieren. Wenn ich meine Migration ausführe, wird folgende Fehlermeldung angezeigt:
[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 table
users
add unique users_email_uniq (
Meine Migration ist wie folgt:
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('name', 32);
$table->string('username', 32);
$table->string('email', 320);
$table->string('password', 64);
$table->string('role', 32);
$table->string('confirmation_code');
$table->boolean('confirmed')->default(true);
$table->timestamps();
$table->unique('email', 'users_email_uniq');
});
Nach einigem googeln bin ich auf diesen Fehlerbericht gestoßen, in dem Taylor sagt, dass Sie den Indexschlüssel als zweiten Parameter angeben können unique()
, was ich getan habe. Es gibt immer noch den Fehler. Was geht hier vor sich?
Antworten:
Geben Sie eine kleinere Länge für Ihre E-Mail an:
Welches ist eigentlich die Standardeinstellung:
Und du solltest gut sein.
Für Laravel 5.4 finden Sie eine Lösung in diesem Laravel 5.4: Angegebener Schlüssel war zu lang Fehler, Laravel News post:
Wie im Migrationshandbuch beschrieben, müssen Sie lediglich Ihre AppServiceProvider.php-Datei bearbeiten und innerhalb der Startmethode eine Standardzeichenfolgenlänge festlegen:
quelle
254
es wahrscheinlich wert, dies zu berücksichtigen. Daher würde ich die Eindeutigkeit in diesem Fall wahrscheinlich mit dem Validator überprüfen.\Illuminate\Database\Schema\Builder::defaultStringLength(191);
für Pfade korrekt FunktionsreferenzUpdate 1
Ab Laravel 5.4 sind diese Änderungen nicht mehr erforderlich.
Update 2
Aktuelle MariaDB-Produktionsversionen unterstützen diese Einstellung standardmäßig NICHT global. Es ist standardmäßig in MariaDB 10.2.2+ implementiert .
Lösung
Und wenn Sie absichtlich die richtige UTF8-
utf8mb4
Multibyte - Unterstützung für 😀 verwenden möchten (ab Laravel 5.4), beginnen Sie mit der Korrektur Ihrer Datenbankkonfiguration.In Laravel
config/database.php
definieren Sie:DYNAMIC
Ermöglicht das Speichern langer Schlüsselindizes .Servereinstellungen (standardmäßig in MySQL 5.7.7+ / MariaDB 10.2.2+ enthalten):
Für Kunden:
Und dann STOPPEN Sie Ihren MySQL / MariaDB-Server. Nach diesem START. Hot RESTART funktioniert möglicherweise nicht.
Jetzt haben Sie Laravel 5.x mit UTF8-Unterstützung.
quelle
database.php
Konfigurationsdatei vorzunehmen, und dies wirkt sich auf das lokale Laravel-Projekt aus. Stellen Sie sicher, dass Sie einedelete
Datenbank erstellen, bevor Sie Änderungen vornehmen, und erstellen Sie sie mit neuen Einstellungen. Sie müssen diemy.cnf
Konfigurationsdatei nur für globale serverseitige Änderungen ändern (derzeit werden alle Neuinstallationen verwendetutf8mb4
).options={"row_format"="DYNAMIC"}
an Ihre@Table
Anmerkung übergeben.Wenn Sie auf Laravel 5.4 sind oder auf Laravel 5.4 aktualisiert haben, hat dies bei mir funktioniert.
Nur 1 Änderung. in AppServiceProvider.php
Wie im Migrationshandbuch https://laravel.com/docs/master/migrations#creating-indexes erwähnt
quelle
Wenn jemand wie ich auf diese Antwort stößt, aber aus einem anderen Grund, können Sie Ihren Laravel DB-Zeichensatz / Ihre Laravel DB-Sortierung überprüfen.
Ich habe eine Anwendung (Snipe-IT) installiert und die Laravel-Datenbankkonfiguration so konfiguriert, dass Folgendes verwendet wird:
Das Entfernen
mb4
von beiden Zeichenfolgen hat das Problem behoben, obwohl ich glaube, dass Antonios Antwort die wirkliche Lösung für das Problem ist.quelle
Das hat bei mir funktioniert:
quelle
Entfernen Sie mb4 aus dem Zeichensatz und die Sortierung aus config / database.php. Anschließend wird es erfolgreich ausgeführt.
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
quelle
Für Laravel 5.6
Diese Lösung löst mein Problem.
Gehen Sie zu
config/database.php
Finden Sie den Code unten
Ändern Sie diese beiden Felder
Mit diesem
quelle
Ich habe das gleiche Problem festgestellt und es behoben, indem ich die folgenden zwei Zeilen in meine app / database.php eingefügt habe
Meine Datei sieht wie folgt aus:
quelle
Für Laravel 5.4 bearbeiten Sie einfach die Datei
quelle
quelle
Ich hatte das gleiche Problem und ich benutze einen Wamp
Lösung: Öffnen Sie die Datei: config / database.php
Vielen Dank
quelle
In der Datei config / database.php wo:
Ändern Sie diese Zeile in folgende:
quelle
Ich habe die Migration selbst hinzugefügt
Ja, ich weiß, dass ich es bei jeder Migration berücksichtigen muss, aber ich würde es lieber tun, als es in einem völlig unabhängigen Dienstanbieter zu verstecken
quelle
Wenn jemand dieses Problem auch danach hat, ändern sich die oben genannten. Zum Beispiel habe ich in meinem Fall die folgenden Änderungen vorgenommen:
Aber es würde aus zwei Gründen nicht sofort funktionieren. Wenn Sie Lumen anstelle von Laravel verwenden, müssen Sie diese Zeile möglicherweise zuerst in Ihrer app.php-Datei auskommentieren.
Und dann müssen Sie das Migrationsskript erneut mit dem Befehl artisan erstellen.
Seitdem funktionieren nur die Änderungen, die Sie an ServiceProvider vorgenommen haben.
quelle
Für Laravel> = 5.6 Benutzer
AppServiceProvider.php
Datei öffnenVerwenden Sie die folgende Klasse
Fügen Sie dann innerhalb der
boot
Methode die folgende Zeile hinzuquelle
Für Laravel 5.7 schreiben Sie diesen Code in appserviceprovider.php
quelle
Ändern Sie den Zeichensatz von 'utf8mb4' in 'utf8' und
Sortierung zu 'utf8mb4_unicode_ci' zu 'utf8_unicode_ci'
in der Datei config / database.php
Es hat bei mir funktioniert.
quelle
Laravel verwendet
utf8mb4
standardmäßig den Zeichensatz, der die Speicherung von "Emojis" in der Datenbank unterstützt. Wenn Sie eine Version von MySQL ausführen, die älter als die Version 5.7.7 oder MariaDB älter als die Version 10.2.2 ist, müssen Sie möglicherweise die durch Migrationen generierte Standardzeichenfolgenlänge manuell konfigurieren, damit MySQL Indizes für sie erstellt. Sie können dies konfigurieren, indem Sie dieSchema::defaultStringLength
Methode in Ihrem Verzeichnis aufrufenAppServiceProvider
:Sie können auschecken
https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes
quelle
Es ist , weil Laravel 5.4 Anwendungen utf8mb4 , die Stützen Emojis zu speichern.
Fügen Sie dies in Ihre app \ Providers \ AppServiceProvider.php ein
und du solltest gut sein zu gehen.
quelle
Wenn Sie Laravel 5.4 und die neueste Version verwenden oder auf diese aktualisieren, funktioniert dies.
Nur 1 Änderung in AppServiceProvider.php
quelle
Ich möchte darauf hinweisen, dass ich etwas verpasst habe ...
Ich bin neu bei Laravel und habe das "use Illuminate ....." nicht kopiert, weil ich wirklich nicht darauf geachtet habe, weil direkt über dem Funktionsstart, den Sie bereits haben, eine use- Anweisung vorhanden ist.
Hoffe das hilft jedem
quelle
\
Ich hatte ein Problem, ändere die Konfiguration der 'config / database'
Beibehaltung des gleichen Musters in der Datenbank.
Ich gab dann den Befehl
quelle
Am 24. Oktober 2016 gab Taylor Otwell, der Autor von Laravel, auf Twitter bekannt
was vor Version 5.4 der Zeichensatz war
utf8
Während dieses Jahrhunderts enthalten viele Web-Apps Chat oder eine Plattform, auf der sich Benutzer unterhalten können, und viele Menschen verwenden gerne Emoji oder Smiley. und dies sind Superzeichen, für deren Speicherung mehr Leerzeichen erforderlich sind und die nur
utf8mb4
als Zeichensatz verwendet werden können . Das ist der Grund, warum sie migrierenutf8mb4
nur für Weltraumzwecke .Wenn Sie in der
Illuminate\Database\Schema\Builder
Klasse nachschlagen, werden Sie feststellen, dass der Wert$defaultStringLength
auf 255 eingestellt ist. Um dies zu ändern, können Sie über dieSchema
Fassade vorgehen und den aufrufendefaultStringLength
Methode und die neue Länge übergeben.Um diese Änderung durchzuführen, rufen Sie diese Methode in Ihrer
AppServiceProvider
Klasse auf, die sich wie folgt im Unterverzeichnis app \ provider befindetIch werde vorschlagen, 191 als Wert zu verwenden, nur weil MySQL 767 Bytes unterstützt und weil
767 / 4
dies die Anzahl der Bytes ist, die jedes Multibyte-Zeichen benötigt191
.Weitere Informationen finden Sie hier. Der utf8mb4-Zeichensatz (4-Byte-UTF-8-Unicode-Codierung) begrenzt die Anzahl der Tabellenspalten und die Zeilengröße
quelle
191
magische Zahl erklärt .LÖSUNG:
Ändern Sie zuerst die defaultStringLength in der Datei app \ Providers \ AppServiceProvider.php in 191 :
Ändern Sie dann die Werte für Zeichensatz und Sortierung in config \ database.php wie folgt :
( Link zum MariaDB-Zeichensatz )
quelle
Gehen Sie zu Ihrem
config/database.php
und ändern Sie den Zeichensatz und die Sortierung von utf8mb4 in utf8Mein Problem wurde mit dieser Methode gelöst, viel Glück, Alter!
quelle
Dieses Problem tritt nicht auf, wenn Sie MySQL 5.7.7+ oder MariaDB 10.2.2+ verwenden.
Um MariaDB auf Ihrem Mac mit Brew zu aktualisieren, entfernen Sie zuerst die Verknüpfung der aktuellen
brew unlink mariadb
und installieren Sie dann eine Entwickler-Version mitbrew install mariadb --devel
Nach Abschluss der Installation stoppen / starten Sie den laufenden Dienst:
brew services stop mariadb brew services start mariadb
Die aktuelle Entwicklungsversion ist 10.2.3. Nach Abschluss der Installation müssen Sie sich darüber keine Gedanken mehr machen und können utf8mb4 (das ist jetzt eine Standardeinstellung in Laravel 5.4) verwenden, ohne wieder zu utf8 zu wechseln oder AppServiceProvider zu bearbeiten, wie in der Laravel-Dokumentation vorgeschlagen: https: // laravel .com / docs / master / release # laravel-5.4 (scrollen Sie nach unten zu: Migration Standard String String Length )
quelle
Gerade MariaDB 10.2.4 RC installiert, neues leeres Laravel 5.4-Projekt gestartet und die Standardmigration (varchar (255) Spalten) funktioniert.
DB conf und Laravael müssen nicht geändert werden
config/database.php
. So wie @scorer das Standardverhalten für 10.2.2+ notiert hat.quelle
Alles wurde in den anderen Anwser gut beschrieben. Weitere Details finden Sie im folgenden Link (Suche mit dem Schlüssel 'Indexlängen & MySQL / MariaDB ") https://laravel.com/docs/5.5/migrations
ABER GUT, darum geht es in dieser Antwort nicht! Die Sache ist, auch wenn Sie die oben genannten Schritte
php artisan migrate
ausführen, möchten Sie einen weiteren Fehler erhalten (wenn Sie den Startbefehl mögen und aufgrund des Problems der Länge die Operation wie in der Mitte stecken bleibt. Die Lösung ist unten und die Benutzertabelle ist wie ohne erstellt den Rest oder nicht ganz richtig) müssen wir bac rollen . Das Standard-Rollback reicht nicht aus. 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 ist es gut zu gehen
quelle
Datenbank-Engine einstellen InnoDB:
quelle
Wenn Sie jede andere Antwort ausprobiert haben und sie nicht funktioniert hat, können Sie alle Tabellen aus der Datenbank löschen und dann den Befehl migrate auf einmal mit diesem Befehl ausführen:
quelle