Wenn ich ein Programm ausführe, das etwas mit MySQL macht, wurde folgende Fehlermeldung angezeigt:
15.06.2011 15: 41: 12.250 ERROR app.wsutils 419 INCRON: Fehler: ('HY000', '[HY000] [MySQL] [ODBC 5.2 (w) -Treiber] [mysqld-5.7.7-rc -log] Indexspalte Größe zu groß. Die maximale Spaltengröße beträgt 767 Byte. (1709) (SQLExecDirectW) ')
Ich habe ein bisschen gegoogelt und festgestellt, dass sich dieser Fehler auf die innodb_large_prefix
-Option bezieht. Ich verwende jedoch MySQL 5.7.7 rc, das innodb_large_prefix
bereits auf "ON" gesetzt hat (in MySQL Workbench geprüft), wodurch bis zu 3072 Bytes möglich sind. Ich bin nicht sicher, ob dies das Problem mit innodb_large_prefix
ist oder nicht.
Hat jemand eine Idee, wie er dieses Problem beheben kann?
Ihre Spalte, die Sie indizieren möchten, ist zu groß und Ihre Einstellungen müssen für innodb_large_prefix
nicht korrekt sein. Es gibt ein paar Voraussetzungen -Parameter, die ebenfalls eingestellt werden müssen, damit innodb_large_prefix
korrekt funktioniert.
Sie können überprüfen, ob innodb_large_prefix gesetzt ist, indem Sie Folgendes ausführen:
show global variables like 'innodb_lar%';
Hier sind einige Voraussetzungen für die Verwendung von innodb_large_prefix:
Sie müssen Ihre globale Variable einstellen. Innodb_file_format = BARRACUDA
um die Einstellungen zu überprüfen: show global variables like 'innodb_fil%';
Auf Tabellenebene müssen Sie ROW_FORMAT = DYNAMIC oder ROW_FORMAT = COMPRESSED verwenden
für Innodb werden Zeilen standardmäßig im COMPACT-Format (ROW_FORMAT = COMPACT) gespeichert.
Mit Hilfe der Antwort von BK435 habe ich Folgendes getan und das Problem gelöst.
set global innodb_file_format = BARRACUDA;
set global innodb_large_prefix = ON;
create table test (........) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
Ich hatte den gleichen Fehler, obwohl innodb_large_prefix
korrekt konfiguriert wurde.
Das Problem war in gebrauchter Kollatierung. In meiner Datenbank war voreingestellte Kollatierung auf utf8mb4_bin
eingestellt (Sie können sie auf der Registerkarte "Operationen" des phpmyadmin für die Datenbank überprüfen). Dies bedeutet, dass 4 Bytes pro Zeichen verwendet werden, während utf8-Kollatierung (z. B. utf8_unicode_ci) 3 Byte pro Zeichen verwendet.
in diesem Fall können Sie entweder eine andere Sortierung verwenden, z. Fügen Sie am Ende der Anweisung DEFAULT CHARSET=utf8
CREATE TABLE
hinzu, oder begrenzen Sie die Indexgröße, indem Sie nur einen Teil des Spaltenwerts wie KEY 'identifier' (column1(5),column2(10))
verwenden.
Siehe auch verwandte Frage: # 1071 - Angegebener Schlüssel war zu lang; Maximale Schlüssellänge beträgt 767 Bytes
Ich habe MariaDB Version 10.1.38 verwendet und alle unten angegebenen Befehle verwendet, aber es hat nicht funktioniert.
set global innodb_large_prefix = ON;
Query OK, 0 rows affected (0.00 sec)
set global innodb_file_per_table = ON;
Query OK, 0 rows affected (0.00 sec)
set global innodb_file_format = Barracuda;
Query OK, 0 rows affected (0.00 sec)
SET GLOBAL innodb_default_row_format = 'DYNAMIC';
Denn nach dem Neustart von MySQL (oder MariaDB) werden diese Einstellungen mit dem Befehl an der mysql-Eingabeaufforderung nicht wiedergegeben: show variables like 'innodb%';
Dann habe ich My.ini bearbeitet und diese Einstellungen in die Datei unter dem Pfad C:\xampp\mysql\bin\my.ini eingefügt
## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'
Ich hatte dieses Problem, weil ich mit varchar (254) versucht hatte, einen String-Primärschlüssel zu erstellen. Manchmal leicht zu übersehen. Überprüfen Sie auch Ihren Indextyp und die Länge. :)
In meinem Fall (MySQL-Version 5.6) bestand das Problem darin, dass ich versuchte, eine Tabelle mit einer Spalte zu erstellen, die bis zu 256 Zeichen enthalten kann (die Datenbank verwendet utf8-Kollatierung), also 3 Byte pro 1 utf8-Zeichen = 256 * 3 = 768 Bytes. Das Update bestand darin, statt 255 nur 255 Zeichen zu verwenden.
Ich könnte auch innodb_large_prefix setzen, wie andere meinen, aber in meinem Fall war es einfacher, weniger Symbole zu haben.