it-swarm.com.de

So beheben Sie MySql: Indexspaltengröße zu groß (Migration von Laravel)

Ich habe ein Projekt mit einer Vagrant-Box kopiert, die Debian, Nginx, PhpMyAdmin usw. installiert. Mit dem neuen Projekt funktioniert php artisan migrate des Laravel nicht mehr und ich erhalte den Fehler

[Illuminate\Database\QueryException]                                                                                                                                      
  SQLSTATE[HY000]: General error: 1709 Index column size too large. The maximum column size is 767 bytes. (SQL: alter table `courses` add unique `courses_name_unique`(`na  
  me`))

Wenn ich einen Speicherauszug (Struktur + Daten) der arbeitenden Projektdatenbank mache und ihn in die Datenbank importiere, um die Fehler bei der Migration anzuzeigen, ist alles in Ordnung und es werden alle Tabellen und Daten erstellt. 

Wie kann ich die Größe festlegen, damit ich die Migrationsmethode ausführen kann?

14
Sven van Zoelen

Wie Sie in der Fehlermeldung sehen können - "Die maximale Spaltengröße beträgt 767 Bytes", wenn Sie einen Index für sie erstellen möchten. Eine VARCHAR(255)-Spalte kann mit utf8 bis zu 765 (255 * 3) Byte und mit utf8mb4 1020 (255 * 4) Byte aufnehmen. Dies liegt daran, dass utf8 in MySQL bis zu 3 Byte und utf8mb4 bis zu 4 Byte (der echte UTF8) benötigt. Das Erstellen eines VARCHAR(255) (eindeutigen) Index mit utf8mb4 schlägt daher fehl.

Dies sind Ihre Optionen, um das Problem zu beheben:

Standard-Kollatierung in my.ini einstellen:

collation_server=utf8_unicode_ci
character_set_server=utf8

Legen Sie beim Erstellen folgende Standard-Kollatierung für die Datenbank fest:

CREATE DATABASE IF NOT EXISTS `your_db` COLLATE 'utf8_unicode_ci'

Legen Sie die Standardkollatierung für die Tabelle/Spalte fest. (Ich empfehle das nicht)

Ändern Sie die Spaltengröße auf 190 (varchar(190)) oder weniger.

Laravel 5.4 fix

Die Konfiguration des Mysql-Servers wird durch den Migrationsbefehl von Laravel überschrieben. Die Kollatierung und der Zeichensatz werden auf die Version der Konfiguration gesetzt.

Ändern Sie die Felder charset und collation der Datenbank-Engine in der Datenbankkonfigurationsdatei in config/database.php.

..
'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', ''),
            //'charset' => 'utf8mb4',
            //'collation' => 'utf8mb4_unicode_ci',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
..
34
Paul Spiegel

Drei Lösungen mit jeweils einem Nachteil:

  • MySQL 5.7 vermeidet das Problem. Erwägen Sie ein Upgrade.

  • VARCHAR(255) ist in der Regel var größer als required . Wenn Sie sicher auf 191 oder weniger schrumpfen können, wird der Fehler behoben.

  • Wechseln Sie zu utf8 (von utf8mb4), falls Sie kein Chinesisch oder Emoji benötigen.

4
Rick James

Aktualisieren Sie für Mariadb Ihre *my.cnf-Datei mit der folgenden Konfiguration:

innodb_default_row_format=dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true

Anschließend müssen Sie den mariadb-Dienst neu starten, damit die aktualisierte Konfiguration wirksam wird.

2
cpxPratik

Standardmäßig verwendet MySQL den Zeichensatz utf8, was bedeutet, dass für jedes Zeichen 3 Bytes verwendet werden. Dies bedeutet, dass der Spaltentyp von varchar (10) 30 Bytes verwendet, was zur Folge hat, dass die maximale Präfixgröße für das Format kompakter Zeilen gleich varchar (255) ist. Das sind 255 * 3 Bytes = 765 Bytes, also zwei Bytes weniger als die maximale Anzahl von 767 Bytes.

Wenn innodb_large_prefix auf on gesetzt ist und das Zeilenformat COMPRESSED oder DYNAMIC verwendet, können Sie die maximale Präfixzeichengröße auf 65536 Byte anstelle von 767 Byte erhöhen. Das folgende Diagramm zeigt die maximale Zeichenlänge mit InnoDB Large Prefix und [COMPRESSED | DYNAMISCHE] Zeilenformate. Diese Werte, die für utf8mb4 erwartet werden, sind höher als die maximale Zeilengröße einer Tabelle. Es gibt also keine Möglichkeit, diese Grenzwerte zu erreichen

Weitere Informationen hier https://discuss.pivotal.io/hc/de-de/articles/115004086747-Appsare-down-due-zu-the-Maximum-Column-Size-is-767- bytes-Beschränkung in MySQL

1

Hatte auch dieses Problem, was ich gerade gemacht habe, von utf8mb4_unicode_ci auf utf8_unicode_ci im db-Verbindungsskript zurückgesetzt

0
Fulela

Es funktioniert mit 5.5.52-MariaDB

Stellen Sie die gesamte Codierung aufutf8_general_ci(Server, Datenbank, Verbindung).

0
Anton