it-swarm.com.de

MySQL-Fehler: Die maximale Spaltengröße beträgt 767 Bytes

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?

8
user3570615

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. 

15
BK435

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;
13

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=utf8CREATE 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'

quelle: https://www.experts-exchange.com/questions/28675824/Warum-am-I-unable-to-turn-innodb-large-prefix-ON-successfully-Every-time-I- Starten Sie-mySql-on-my-Ubuntu-VPS-it-resets-to-OFF.html neu

0
Techifylogic

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. :)

0
Simon Lippens

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.

0
Ievgen