2008-09-16 10 views
11

Ich arbeite mit einer ziemlich einfachen Datenbank, aus einer Java-Anwendung. Wir versuchen, etwa 200.000 Text gleichzeitig mit dem Standard-JDBC-MySQL-Adapter einzufügen. Wir erhalten intermittierend eine com.mysql.jdbc.MysqlDataTruncation: Daten abgeschnitten: Daten zu lang für Spaltenfehler.MySQL Data Truncation Fehler

Der Spaltentyp ist longtext und die Sortierfolge der Datenbank ist UTF-8. Der Fehler tritt auf, wenn sowohl MyISAM- als auch InnoDB-Tabellen-Engines verwendet werden. Die maximale Paketgröße wurde sowohl auf Client- als auch auf Serverseite auf 1 GB festgelegt, sodass auch dies kein Problem verursachen sollte.

Antwort

4

Nun können Sie den Fehler ignorieren, indem Sie eine INSERT IGNORE ausführen, die nur die Daten abschneidet und sie trotzdem einfügt. (Von http://dev.mysql.com/doc/refman/5.0/en/insert.html)

Wenn Sie das Schlüsselwort IGNORE verwenden, Fehler die auftreten, während die INSERT Anweisung ausgeführt werden als Warnungen behandelt statt. Ohne IGNORE beispielsweise eine Zeile, die einen vorhandenen UNIQUE-Index oder PRIMARY KEY-Wert in dupliziert, verursacht die Tabelle einen doppelten Schlüsselfehler , und die Anweisung wird abgebrochen. Mit IGNORE wird die Zeile immer noch nicht eingefügt, , aber es wird kein Fehler ausgegeben. Daten Konvertierungen, die Fehler auslösen würden Abbruch der Anweisung, wenn IGNORE nicht angegeben ist. Mit IGNORE werden ungültige Werte auf die nächsten Werte eingestellt und eingefügt; Warnungen werden erzeugt, aber die Anweisung wird nicht abgebrochen.

2

Es klingt für mich wie Sie versuchen, zu viele Bytes in eine Spalte zu setzen. Ich bin letzte Nacht über einen sehr ähnlichen Fehler mit MySQL gelaufen, aufgrund eines Fehlers in meinem Code. Ich meinte

foo.status = 'inactive' 

zu tun hatte, aber eigentlich

getippt
foo.state = 'inactive' 

Wo foo.state soll ein zweistelliger Code für einen US-Staat (varchar (2)) sein. Ich habe den gleichen Fehler wie du. Sie könnten nach einer ähnlichen Situation in Ihrem Code suchen.

10

Überprüfen Sie, ob Ihre UTF-8-Daten alle aus 3-Byte-Unicode bestehen. Wenn Sie 4-Byte-Zeichen haben (legal in Unicode und Java, illegal in MySQL 5), kann dieser Fehler beim Versuch, sie einzufügen, auftreten. Dies ist ein issue that should be fixed in MySQL 6.0.

+0

Wie kann ich überprüfen, ob meine UTF-8-Daten alle 3-Byte-Unicode? – JAVAGeek

+0

@JAVAGeek: Gute Frage, die wohl getrennt gestellt werden sollte. Es gibt verschiedene Möglichkeiten. Eine Möglichkeit, die in Java funktionieren könnte, besteht darin, zu überprüfen, ob in der Zeichenfolge Codepunkte vorhanden sind, die durch mehr als ein Zeichen repräsentiert werden, wie zum Beispiel: 's.length() == s.toCharArray () .Länge'. Wenn dies der Fall ist, hat "s" die gleiche Anzahl an Codepunkten und Zeichen, so dass nur BMP-Zeichen verwendet werden, die in UTF-8 mit bis zu 3 Bytes dargestellt werden. – Avi

1

Ich habe gerade dieses Problem und löste es, indem Sie alle Nicht-Standard ASCII-Zeichen in meinem Text (nach den obigen UTF-8 Hinweise) entfernen.

Ich hatte das Problem auf einem Debian 4, Java 5 System; aber der gleiche Code funktionierte gut mit Ubuntu 9.04, Java 6. Beide laufen MySql 5.

4

In mysql Sie MEDIUMTEXT oder LONGTEXT Feldtyp für große Textdaten verwenden können