webentwicklung-frage-antwort-db.com.de

Laravel-Migrationsfehler: Syntaxfehler oder Zugriffsverletzung: 1071 Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 767 Bytes

Migrationsfehler auf Laravel 5.4 mit php artisan make:auth

[Illuminate\Database\QueryException] SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1071 Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 767 Bytes (SQL: alter tabl users eindeutigen users_email_unique (email)).

[PDOException] SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1071 Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 767 Bytes

81
absiddiqueLive

Laut der offiziellen Dokumentation können Sie dies ganz leicht lösen.

Fügen Sie folgenden Code zu AppServiceProvider.php hinzu (/app/Providers/AppServiceProvider.php)

use Illuminate\Support\Facades\Schema; //NEW: Import Schema

function boot()
{
    Schema::defaultStringLength(191); //NEW: Increase StringLength
}

MySQL reserviert immer den maximalen Betrag für ein UTF8-Feld, das 4 Byte beträgt, also mit 255 + 255 mit Ihrem DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Sie überschreiten die maximale Schlüssellänge von 767. Mit @scaisedge

123
absiddiqueLive

Ich weiß nicht, warum die obige Lösung und die offizielle Lösung, die hinzugefügt wird 

Schema::defaultStringLength(191);

in AppServiceProvider hat bei mir nicht funktioniert . Was funktioniert hat, war die Bearbeitung der database.php-Datei im config-Ordner ..__ 

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

zu 

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

und es sollte funktionieren .. Hoffe, es hilft.

57
Koushik Das

Ich füge diese Antwort hier nur hinzu, da es diequickest-Lösung für mich ist. Setzen Sie einfach das Standard-Datenbankmodul auf'InnoDB'on 

/config/database.php

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

führen Sie dannphp artisan config:cacheaus, um den Konfigurationscache zu löschen und zu aktualisieren

32
Dexter Bengil

In AppServiceProvider.php fügen Sie diesen Code oben in die Datei ein.

use Illuminate\Support\Facades\Schema;

Und Sie fügen diesen Code in der Startmethode hinzu.

 Schema::defaultStringLength(191);
21
user7688086

Dieses Problem wird in Laravel 5.4 von der Datenbankversion verursacht.

Entsprechend den docs (im Abschnitt Index Lengths & MySQL / MariaDB):

Laravel verwendet standardmäßig den utf8mb4-Zeichensatz, der .__ enthält. Unterstützung für das Speichern von "Emojis" in der Datenbank. Wenn Sie ein .__ ausführen. Version von MySQL älter als 5.7.7 oder MariaDB älter als In Version 10.2.2 müssen Sie möglicherweise die Standardeinstellung .__ manuell konfigurieren. Durch Migrationen generierte Zeichenfolgenlänge, damit MySQL .__ erstellt. Indizes für sie. Sie können dies konfigurieren, indem Sie die .__ aufrufen. Schema::defaultStringLength-Methode in Ihrer AppServiceProvider.

Mit anderen Worten, in <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);
}

// ...

}

Aber wie der Kommentar zu der anderen Antwort sagt:

Seien Sie vorsichtig bei dieser Lösung. Wenn Sie E-Mail-Felder indizieren, z. B. Gespeicherte E-Mails dürfen maximal 191 Zeichen lang sein. Das ist weniger als die offiziellen RFC-Staaten.

Daher schlägt die Dokumentation auch eine andere Lösung vor:

Alternativ können Sie die innodb_large_prefix-Option für Ihr .__ aktivieren. Datenbank. Anweisungen zu .__ finden Sie in der Dokumentation Ihrer Datenbank. So aktivieren Sie diese Option.

17
Esteban Herrera

Für jemanden, der AppServiceProvider.php..__ nicht ändern möchte (meiner Meinung nach ist es keine gute Idee, AppServiceProvider.php nur für die Migration zu ändern)

Sie können die Datenlänge der Migrationsdatei unter database/migrations/ wie folgt hinzufügen:

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

Fügen Sie den folgenden Code in app/Providers/AppServiceProvider.php Methode:

use Illuminate\Support\Facades\Schema;

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

zuerst müssen Sie (falls vorhanden) die Tabelle sers table, password_resets aus der Datenbank löschen und die Einträge users und password_resets aus der Tabelle migrations und anschließend Nach dem Löschen alter Tabellen führen Sie php artisan migrate Befehl

6
Udhav Sarvaiya

Anstelle einer Begrenzung der Länge würde ich Folgendes vorschlagen, was für mich funktioniert hat.

Innerhalb 

config/database.php

ersetzen Sie diese Zeile für MySQL

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

auf

'engine' => null,

Ich habe dieses Problem gelöst und meine config-> database.php -Datei so bearbeitet, dass sie meiner Datenbank ('charset' => 'utf8') und der ('collation' => 'utf8_general_ci') - gefällt. , Mein Problem ist also der Code wie folgt gelöst:

'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

Wie bereits angegeben, fügen wir AppServiceProvider.php in App/Providers hinzu

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

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

weitere Informationen finden Sie im Link unten (Suche nach "Indexlänge & MySQL/MariaDB") https://laravel.com/docs/5.5/migrations

Aber gut, das ist nicht das, worüber ich alles veröffentlicht habe! Die Sache ist selbst dann, wenn Sie die oben genannten ausführen, werden Sie wahrscheinlich einen weiteren Fehler erhalten (das ist, wenn Sie den php artisan migrate-Befehl ausführen und aufgrund des Längenproblems die Operation wahrscheinlich in der Mitte stecken bleibt. Lösung ist unterhalb von, und die Benutzertabelle wird wahrscheinlich ohne den Rest erstellt oder ist nicht ganz korrekt) wir müssen zurücksetzen. Das Standard-Rollback funktioniert nicht. weil die Operation der Migration nicht fertig war. Sie müssen die neu erstellten Tabellen in der Datenbank manuell löschen.

wir können es basteln wie unten beschrieben:

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 dem Benutzertisch. 

danach bist du gut zu gehen

php artisan migrate:rollback

php artisan migrate

4
Mohamed Allal

In AppServiceProvider.php Datei:

use Illuminate\Support\Facades\Schema;

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

Schema::defaultStringLength(191); definiert standardmäßig die Länge aller Zeichenfolgen 191, wodurch Ihre Datenbank beschädigt werden kann. Du darfst nicht diesen Weg gehen.

Definieren Sie einfach die Länge einer bestimmten Spalte in der Datenbankmigrationsklasse. Zum Beispiel definiere ich "Name", "Benutzername" und "E-Mail" in der CreateUsersTable-Klasse wie folgt:

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

Wie im Migrationsleitfaden beschrieben, müssen Sie lediglich Ihr app/Providers/AppServiceProvider.php Datei und innerhalb der Boot-Methode eine Standard-String-Länge festlegen:

use Illuminate\Support\Facades\Schema;

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

Hinweis: Zuerst müssen Sie (wenn Sie haben) Benutzer Tabelle, password_resets Tabelle aus der Datenbank und löschen Sie Benutzer und password_resets-Einträge aus der Migrations- Tabelle.

Führen Sie den Befehl migrate Artisan aus, um alle ausstehenden Migrationen auszuführen:

php artisan migrate

Danach sollte alles wie gewohnt funktionieren.

3
user9162235

Ich füge zwei Lösung die Arbeit für mich hinzu.

1. Lösung ist : 

  1. Öffnen Sie die Datei database.php im Ordner config.
  2. 'engine' => null, in 'engine' => 'InnoDB', bearbeiten

    Das hat bei mir funktioniert.

2. Lösung ist:

  1. Öffnen Sie die Datei database.php im Ordner config.
    2 .Bearbeiten
    'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
    zu 

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


Viel Glück

3
Arslan Ahmad

Wenn Sie diesen Fehler bei der Arbeit mit Laravel während der Verwendung des Befehls "php artisan migrate" Feststellen, fügen Sie einfach 2 Zeilen in der Datei hinzu: app-> Providers-> AppServiceProvider.php

  1. schema verwenden;
  2. Schema :: defaultStringLength (191);

bitte überprüfen Sie das Bild . Führen Sie dann erneut den Befehl "php artisan migrate" aus. php artisan migrate

2
Abdul Rasheed

Dies ist üblich, da Laravel 5.4 den Standard-Datenbankzeichensatz auf utf8mb4 geändert hat. Was Sie tun müssen, ist: Bearbeiten Sie App\Providers.php, indem Sie diesen Code vor der Klassendeklaration einfügen

use Illuminate\Support\Facades\Schema;

Fügen Sie dies auch der 'boot'-Funktion hinzu Schema::defaultStringLength(191);

2
Treasure

Ich habe gerade folgende Zeile in users und password_resets Migrationsdatei geändert.

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

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

2
Mahesh Gaikwad

Wie im Migrationshandbuch beschrieben, müssen Sie lediglich Ihre AppServiceProvider.php-Datei bearbeiten und in der Boot-Methode eine Standard-String-Länge festlegen:

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

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

Hoffe das wird dir helfen..cheers ..

2
Rohit Saini

aktualisieren Sie diese Zeilen und fügen Sie sie in app/Providers/AppServiceProvider.php ein

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

stellen Sie Ihre Datenbank-Engine in config/database.php im 'mysql'-Array ein

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

Wenn Sie Ihrer Datenbank noch keine Daten zugewiesen haben, gehen Sie wie folgt vor:

  1. Gehen Sie zu app/Providers/AppServiceProvide.php und fügen Sie hinzu

verwenden Sie Illuminate\Support\ServiceProvider.

und innerhalb der Methode boot ();

Schema :: defaultStringLength (191);

  1. Löschen Sie nun die Datensätze in Ihrer Datenbank, zB Benutzertabelle.

  2. führen Sie Folgendes aus

pHP Artisan Config: Cache

pHP-Handwerker migrieren

2
Levinski Polish

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 in die zweite Zeile.

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();

Nach erfolgreichen Änderungen können Sie die Migration ausführen.
Hinweis: Zuerst müssen Sie (falls vorhanden) users table, password_resets table aus der Datenbank löschen und Benutzer- und password_resets-Einträge aus der Migrationstabelle löschen.

2

1- Gehe zu/config/database.phpund finde diese Zeilen

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

und ändern sie in:

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

2- Runphp artisan config:cacheum Laravel neu zu konfigurieren

3- Löschen Sie die vorhandenen Tabellen in Ihrer Datenbank und führen Sie dannphp artisan migrateerneut aus

1

Die empfohlene Lösung ist die Aktivierung der innodb_large_prefix-Option von MySQL, damit Sie keine nachfolgenden Probleme bekommen. Und so geht's:

Öffnen Sie die MySQL-Konfigurationsdatei my.ini und fügen Sie die folgenden Zeilen unter der Zeile [mysqld] so hinzu.

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

Speichern Sie anschließend Ihre Änderungen und starten Sie Ihren MySQL-Dienst neu.

Rollback bei Bedarf und führen Sie dann die Migration erneut aus.


Für den Fall, dass Ihr Problem weiterhin besteht, gehen Sie zu Ihrer Datenbankkonfigurationsdatei und legen Sie fest 

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

Ich hoffe es hilft!

1
Sammie

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

1
F.E Noel Nfebe

Ich denke, es ist eine wirklich schlechte Idee, StringLenght auf 191 zu zwingen. Also untersuche ich, um zu verstehen, was los ist.

Ich habe festgestellt, dass diese Fehlermeldung:

SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1071 Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 767 Bytes

Es wurde angezeigt, nachdem ich meine MySQL-Version aktualisiert hatte. Also habe ich die Tabellen mit PHPMyAdmin überprüft und festgestellt, dass alle neu erstellten Tabellen mit der Kollatierung utf8mb4_unicode_ci anstelle von utf8_unicode_ci für die alten erstellt wurden.

In meiner Doctrine-Konfigurationsdatei ist mir aufgefallen, dass charset auf utf8mb4 gesetzt war, aber alle meine vorherigen Tabellen wurden in utf8 erstellt. Ich denke, dies ist ein Update-Zauber, der auf utf8mb4 funktioniert.

Jetzt können Sie den Zeilen-Zeichensatz in Ihrer ORM-Konfigurationsdatei ändern. Dann löschen Sie die Tabellen mit utf8mb4_unicode_ci, wenn Sie sich im dev-Modus befinden, oder korrigieren den Zeichensatz, wenn Sie sie nicht löschen können.

Für Symfony 4 

charset ändern: utf8mb4 to charset: utf8 in config/packages/doctrine.yaml

Jetzt arbeiten meine Doktrinmigrationen wieder gut.

1
Kaizoku Gambare

Die angesprochene Arbeit bestand darin, einen zweiten Parameter mit dem Schlüsselnamen (einen kurzen) zu übergeben:

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

Für alle anderen, die auf dieses Problem stoßen könnten, bestand mein Problem darin, dass ich eine Spalte des Typs string erstellte und versuchte, sie ->unsigned() zu erstellen, als ich beabsichtigte, eine Ganzzahl zu sein. 

0
Brynn Bateman

zuerst alle tabellen der datenbank im localhost löschen

Ä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.

0

Das Ändern meines lokalen Datenbankservertyps von "mariadb" in "mysql" hat dies für mich behoben, ohne dass ich irgendwelche Laravel Dateien bearbeiten musste.

Ich habe dieses Tutorial befolgt, um meinen Datenbankservertyp zu ändern: https://odan.github.io/2017/08/13/xampp-replacing-mariadb-with-mysql.html

0
Adam Winster

Ich habe diesen Fehler erhalten, obwohl ich bereits Schema :: defaultStringLength (191) hatte (eigentlich weil hatte); in meiner AppServiceProvider.php-Datei.

Der Grund dafür ist, dass ich bei einer meiner Migrationen versucht habe, einen Zeichenfolgenwert auf einen Wert über 191 festzulegen:

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();
});

Das Entfernen der 1000 oder das Setzen auf 191 löste mein Problem.

0
Jacey

Sie können eine Zeichenfolgenlänge für das indizierte Feld wie folgt festlegen:

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

Für Lumen:

Zur .env Datei hinzufügen

DB_ENGINE=InnoDB
0
Scotty G