Problem mit der maximalen Zeilengröße in MySQL

8

Ich habe ein Problem mit MySQL, ich habe eine Tabelle mit vielen Textfeldern. Wenn ich versuche, einige Daten zu speichern, erhalte ich diesen Fehler.

Zeilengröße zu groß. Die maximale Zeilengröße für den verwendeten Tabellentyp ohne BLOBs beträgt 8126. Sie müssen einige Spalten in TEXT oder BLOBs ändern

Der Text, den ich in jedem Feld speichere, ist nicht zu lang, nur ein paar Absätze in jedem.

Was kann ich machen?

Memochipan
quelle

Antworten:

9

Danke für die Leute, die antworten. Die von Ihnen geposteten Links waren eine sehr nützliche Basis, um mit dem Lernen zu beginnen.

Schließlich fand ich diese Seite: http://download.oracle.com/docs/cd/E17952_01/refman-5.5-en/innodb-compression-usage.html

Und ich habe my.cnf konfiguriert und diese beiden Zeilen im [mysqld]Abschnitt hinzugefügt :

innodb_file_per_table
innodb_file_format = Barracuda

Dann habe ich ALTERmeine Tabelle mit diesem Befehl über phpMyAdmin:

ALTER TABLE nombre_tabla
 ENGINE=InnoDB
 ROW_FORMAT=COMPRESSED 
 KEY_BLOCK_SIZE=8; 
 SHOW WARNINGS;

Es ist auch möglich, andere Einstellungen zu verwenden, die Sie im obigen Link lesen können, aber diese haben für mich gut funktioniert.

Memochipan
quelle
Ich habe nicht viele Informationen über den Nachteil von COMPRESSED und Barracuda gefunden. Warum nicht immer das verwenden, wenn das besser ist und dies löst?
Ted
3

Vielleicht möchten Sie sich diesen Artikel ansehen, in dem viel über die MySQL-Zeilengrößen erklärt wird. Es ist wichtig zu beachten, dass selbst wenn Sie TEXT- oder BLOB-Felder verwenden, Ihre Zeilengröße immer noch über 8 KB liegen kann (Limit für InnoDB), da die ersten 768 Bytes für jedes Feld inline auf der Seite gespeichert werden. Der einfachste Weg, dies zu beheben, ist die Verwendung des Barracuda-Dateiformats mit InnoDB. Dies beseitigt das Problem im Grunde genommen insgesamt, indem nur der 20-Byte-Zeiger auf die Textdaten gespeichert wird, anstatt die ersten 768 Bytes zu speichern.

Kibbee
quelle
1

Nun, machen Sie, was MySQL sagt: Konvertieren Sie große Felder von Varchar in Text oder Blob (ALTER TABLE). Textfelder verhalten sich ähnlich wie varchar (Indizes benötigen eine Präfixlänge, funktionieren aber trotzdem), werden jedoch separat gespeichert.

Diese Referenz gibt Ihnen die genauen Grenzen jeder Standard-MySQL-Tabellen-Engine an:

http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

Und hier ist alles, was Sie über Textfelder wissen sollten:

http://dev.mysql.com/doc/refman/5.0/en/blob.html

Korkman
quelle
Vielen Dank an @korkman für Ihre Antwort. Meine Felder wurden bereits als Text definiert, als das Problem auftrat. Ich werde mir Ihre Linkvorschläge ansehen.
Memochipan
0

Meistens Cross-Posting von Stack Overflow , aber dies ist ein offener (und verifizierter) Fehler in der InnoDB-Engine des MySQL-Servers . Eine vorübergehende Lösung besteht derzeit darin, auf die MyISAM- Engine als temporären Speicher zurückzugreifen. Also, in Ihrer my.cnf-Datei:

internal_tmp_disk_storage_engine=MyISAM
hjpotter92
quelle