Laravel-Migration: eindeutiger Schlüssel ist zu lang, selbst wenn angegeben

Ich versuche, eine Benutzer-Tabelle in Laravel zu migrieren. Wenn ich meine Migration starte, erhalte ich folgende Fehlermeldung:

[Illuminate \ Database \ QueryException] SQLSTATE [42000]: Syntaxerrors oder Zugriffsverletzung: 1071 Der angegebene Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 767 Byte (SQL: alter table users fügt eindeutige users_email_uniq ( email ) hinzu)

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, wo Taylor sagt, dass Sie den Indexschlüssel als zweiten Parameter von unique() angeben können, was ich getan habe. Es gibt immer noch den Fehler. Was geht hier vor sich?

Geben Sie eine kleinere Länge für Ihre E-Mail an:

 $table->string('email', 250); 

Welches ist die Standardeinstellung?

 $table->string('email'); 

Und du solltest gut sein.

Für Laravel 5.4 finden Sie in diesem Laravel 5.4 eine Lösung : Der angegebene Schlüssel war zu lang, Laravel News post:

Wie im Migrationsleitfaden beschrieben, um dies zu beheben, müssen Sie lediglich Ihre AppServiceProvider.php-Datei bearbeiten und innerhalb der Boot-Methode eine Standard-String-Länge festlegen:

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

Update 1

Ab Laravel 5.4 sind diese Änderungen nicht mehr erforderlich.

Laravel 5.4 verwendet standardmäßig den Zeichensatz utf8mb4, der die Speicherung von “Emojis” in der database unterstützt. Wenn Sie Ihre Anwendung von Laravel 5.3 aktualisieren, müssen Sie nicht zu diesem Zeichensatz wechseln.

Update 2

Aktuelle Produktionen von MariaDB Versionen unterstützen diese Einstellung NICHT standardmäßig global. Es ist standardmäßig in MariaDB 10.2.2+ implementiert.

Lösung

Und wenn Sie absichtlich den richtigen zukünftigen Standard (ab Laravel 5.4) UTF8 multi-byte utf8mb4 Unterstützung für 😀 verwenden möchten, dann beginnen Sie, Ihre databasekonfiguration zu reparieren.

In Laravel config/database.php definieren Sie:

 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', 

DYNAMIC ermöglicht das Speichern langer Schlüsselindizes .

Servereinstellungen (standardmäßig in MySQL 5.7.7+ / MariaDB 10.2.2+ enthalten):

 [mysqld] # default character set and collation collation-server = utf8mb4_unicode_ci character-set-server = utf8mb4 # utf8mb4 long key index innodb_large_prefix = 1 innodb_file_format = barracuda innodb_file_format_max = barracuda innodb_file_per_table = 1 

Für Kunden:

 [mysql] default-character-set=utf8mb4 

Und dann STOPPEN Sie Ihren MySQL / MariaDB-Server. Danach START. Hot RESTART funktioniert möglicherweise nicht.

 sudo systemctl stop mysqld sudo systemctl start mysqld 

Jetzt haben Sie Laravel 5.x mit UTF8-Unterstützung.

Wenn du bei Laravel bist oder aktualisiert hast 5.4 Das hat bei mir funktioniert;

Nur 1 Änderung. in AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

Wie im Migrationsleitfaden https://laravel.com/docs/master/migrations#creating-indexes erwähnt

Wenn jemand anders auf diese Antwort stößt wie ich, aber aus einem anderen Grund, können Sie Ihren Laravel DB-Zeichensatz überprüfen.

Ich habe eine Anwendung (Snipe-IT) installiert und die Laravel-databasekonfiguration so konfiguriert, dass sie Folgendes verwendet:

 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', 

Das Entfernen von mb4 aus beiden Strings behob das Problem, obwohl ich glaube, dass Antonio’s Antwort die wirkliche Lösung des Problems ist.

Das hat für mich funktioniert:

  $table->charset = 'utf8'; $table->collation = 'utf8_unicode_ci'; 

Entfernen Sie mb4 von charset und collation aus der config / database.php, dann wird es erfolgreich ausgeführt.
‘Zeichensatz’ => ‘utf8’,
‘Sortierung’ => ‘utf8_unicode_ci’,

Für Laravel 5.4 einfach Datei bearbeiten

App \ Providers \ AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

Ich habe das gleiche Problem, und behoben, indem Sie die folgenden zwei Zeilen in meiner app / database.php

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

Meine Datei sieht wie folgt aus:

 < ?php return [ /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ 'default' => env('DB_CONNECTION', 'mysql'), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', ...... 

Ich habe die Migration selbst hinzugefügt

 Schema::defaultStringLength(191); Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); 

Ja, ich weiß, dass ich es bei jeder Migration berücksichtigen muss, aber das würde ich lieber in einem völlig unabhängigen Dienstleister tun

Für Laravel 5.6
Diese Lösung triggers mein Problem
Gehe zu config/database.php
Finde den Code unten

 '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' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 

Ändern Sie dieses zwei Feld

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

Mit diesem

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

Ich hatte das gleiche Problem und ich benutze einen Wamp

Lösung: Öffnen Sie die Datei config / database.php

 'engine' => null, => 'engine' => 'InnoDB', 

Vielen Dank

In der Datei config / database.php wo:

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

Ändern Sie diese Zeile wie folgt:

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

Das liegt daran, dass Laravel 5.4 utf8mb4 verwendet, das das Speichern von Emojis unterstützt.

Fügen Sie dies in Ihrer App \ Providers \ AppServiceProvider.php hinzu

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

und du solltest gut gehen.

Wenn Sie auf Laravel 5.4 und auf der neuesten Version sind, funktioniert es;
Nur 1 Änderung in AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 
 File: config/database.php change the following FROM -> 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', TO -> 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 

Ändere den Zeichensatz von ‘utf8mb4’ zu ‘utf8’ und

Kollation zu ‘utf8mb4_unicode_ci’ zu ‘utf8_unicode_ci’

in der Datei config / datenbank.php

Es hat für mich funktioniert.

Laravel verwendet utf8mb4 Zeichensatz utf8mb4 , der die Speicherung von “Emojis” in der database unterstützt. Wenn Sie eine Version von MySQL älter als die Version 5.7.7 oder MariaDB älter als die Version 10.2.2 ausführen, müssen Sie möglicherweise die von den Migrationen generierte Standardzeichenfolgenlänge manuell konfigurieren, damit MySQL Indizes für sie erstellen kann. Sie können dies konfigurieren, indem Sie die Methode Schema::defaultStringLength in Ihrem AppServiceProvider :

 use Illuminate\Support\Facades\Schema; /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } 

Sie können auschecken

https://laravel-news.com/laravel-5-4-key-tool-long-error https://laravel.com/docs/5.5/migrations#indexes

Ich möchte darauf hinweisen, dass etwas, was ich vermisst habe …

Ich bin neu bei Laravel, und ich habe nicht die “Illuminate ….. Illuminate” -Datei kopiert, weil ich wirklich keine Aufmerksamkeit geschenkt habe, denn direkt über der function boot hast du bereits eine Use- statement.

Hoffe das hilft jedem

 **use Illuminate\Support\Facades\Schema;** public function boot() { Schema::defaultStringLength(191); } 

Für Laravel> = 5,6 Benutzer

Öffnen AppServiceProvider.php Datei AppServiceProvider.php

Verwenden Sie die folgende class

 use Illuminate\Support\Facades\Schema; 

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, heben Sie zuerst die brew unlink mariadb : brew unlink mariadb und installieren brew unlink mariadb dann einen dev mit brew install mariadb --devel

Nach der Installation stoppen / starten Sie den Dienst läuft: brew services stop mariadb brew services start mariadb

Aktuelle Entwicklerversion ist 10.2.3. Nachdem die Installation abgeschlossen ist, müssen Sie sich nicht mehr darum kümmern und Sie können utf8mb4 (das ist jetzt ein Standard in Laravel 5.4) verwenden, ohne zu utf8 zurückzukehren oder AppServiceProvider wie in der Laravel-Dokumentation beschrieben zu bearbeiten: https: // laravel .com / docs / master / releases # laravel-5.4 (scrollen Sie nach: Migration Standard String Länge )

Gerade installiert MariaDB 10.2.4 RC, gefeuert neue leere Laravel 5.4 Projekt und Standard-Migration (varchar (255) Spalten) funktioniert.

Keine Notwendigkeit, DB conf und Laravael config/database.php zu ändern. So wie @scorer über Standardverhalten für 10.2.2+ notierte.

schließe diese Zeile oben ein

Verwenden Sie Illuminate \ Support \ Facades \ Schema;

dann innerhalb der Boot-function fügen Sie dies hinzu

Schema :: defaultStringLength (191);

Alles wurde gut in den anderen beschrieben. Anwwers können Sie mehr Details im folgenden Link sehen (Suche mit Schlüssel ‘Index Lengths & MySQL / MariaDB “) https://laravel.com/docs/5.5/migrations

ABER DAS IST NICHT, worum es bei dieser Antwort geht! die Sache ist sogar mit dem oben genannten tun Sie möchten einen anderen Fehler erhalten (das ist, wenn Sie php artisan migrate Befehl mögen und wegen des Problems der Länge, die Operation wie in der Mitte stecken. Lösung ist unten , und die Benutzer-Tabelle ist wie geschaffen ohne den Rest oder nicht völlig korrekt) müssen wir bac k rollen . das Standard-Rollback geht nicht. weil der Vorgang der Migration nicht fertig war. Sie müssen die neu erstellten Tabellen manuell in der database löschen.

wir können es tun, indem wir wie folgt basteln:

 L:\todos> php artisan tinker Psy Shell v0.8.15 (PHP 7.1.10 — cli) by Justin Hileman >>> Schema::drop('users') => null 

Ich selbst hatte ein Problem mit der Benutzertabelle.

Danach geht es dir gut

 php artisan migrate:rollback php artisan migrate 

Stellen Sie die database-Engine InnoDB ein:

  Schema::create('users', function (Blueprint $table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); 

Wenn Sie alle anderen Antworten versucht haben und sie nicht funktioniert haben, können Sie alle Tabellen aus der database löschen und dann den Migrationsbefehl mit dem folgenden Befehl ausführen:

 php artisan migrate:fresh 

Wenn Sie diesen Fehler sehen, müssen Sie auf jeden Fall folgende Änderungen an der Datei AppServiceProvider.php -> die sich in app->providers:

Änderungen vorgenommen werden

 use Illuminate\Support\Facades\Schema; //see if you have this class if not add it. public function boot() { Schema::defaultStringLength(191); //make sure you add this line } 

Dies sollte Ihr Problem lösen, für mehr können Sie die Laravel Nachrichten zu diesem Thema sehen. https://laravel-news.com/laravel-5-4-key-tool-long-error

Ich hatte ein Problem, ändere die Konfiguration der ‘config / database’

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

Das gleiche Muster in der database beibehalten.

Ich gab dann den Befehl

 php artisan migrate 

Bitte öffnen Sie die user und password Rest-Dateien. Dateien befinden sich im Ordner database / Migrationen.

Zeile hinzufügen

 Schema::defaultStringLength(191); in up function in both files. 

Dann renne

 php artisan migrate