"Daten zu lang für Spalte" - warum?

73

Ich habe ein MySQL-Skript geschrieben, um eine Datenbank für hypothetische Krankenhausunterlagen zu erstellen und diese mit Daten zu füllen. Eine der Tabellen, Abteilung, enthält eine Spalte mit dem Namen Beschreibung, die als Typ varchar (200) deklariert ist. Beim Ausführen des INSERT-Befehls für Beschreibung wird folgende Fehlermeldung angezeigt:

Fehler 1406: Daten zu lang für Spalte 'Beschreibung' in Zeile 1.

Alle Zeichenfolgen, die ich einfüge, bestehen aus weniger als 150 Zeichen.

Hier ist die Erklärung:

CREATE TABLE Department(
    ...
    Description varchar(200)
    ...);

Und hier ist der Einfügebefehl:

INSERT INTO Department VALUES
(..., 'There is some text here',...), (..., 'There is some more text over here',...);

Dies sollte anscheinend funktionieren. Hat jemand einen Einblick?

Ben C.
quelle
10
Sind Ihre Strings Multibyte UTF-8?
NDM
Möglicherweise handelt es sich um Leerzeichen. Woher kommen die Daten?
Dan Bracuk
Tischmaschine: Myisam, Innodb oder welche?
STT LCU
3
Ich hatte diesen Fehler schon einmal wegen eines nicht entkommenen Apostrophs
tgolisch
@STTLCU - Es ist InnoDB
Ben C.

Antworten:

74

Ändern Sie den Spaltentyp in LONGTEXT

Alexander Serkin
quelle
3
sollte die richtige Antwort sein - stattdessen das Problem durch Deaktivieren strikt zu maskieren, statt die Ursache zu beheben
Eugen Mayer
50

Ich hatte ein ähnliches Problem beim Migrieren einer alten Datenbank auf eine neue Version.

Schalten Sie den MySQL-Modus um, um STRICT nicht zu verwenden.

SET @@global.sql_mode= 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Fehlercode: 1406. Daten zu lang für Spalte - MySQL

Calraiden
quelle
1
Dies hat gut gepasst und ein ähnliches Problem gelöst, mit dem ich heute konfrontiert war. Nur aus Neugier ... gibt es irgendwelche Nachteile bei dieser Lösung?
Ravi Gaurav Pandey
Dies hängt von Ihrem Code ab, da der strikte Modus eine zusätzliche Kontrolle über MySQL darstellt, um das Einfügen ungültiger Daten zu vermeiden. Wenn Ihr Code in der vorherigen Version von MySQL einwandfrei funktioniert, haben Sie in der neuen Version keine Probleme. Die lange Erklärung: dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict
Calraiden
17

Es gibt eine feste Grenze dafür, wie viele Daten in einer einzelnen Zeile einer MySQL-Tabelle gespeichert werden können, unabhängig von der Anzahl der Spalten oder der Länge der einzelnen Spalten.

Wie in der AMTLICHEN DOKUMENTATION angegeben

Die maximale Zeilengröße beschränkt die Anzahl (und möglicherweise Größe) der Spalten, da die Gesamtlänge aller Spalten diese Größe nicht überschreiten darf. Beispielsweise benötigen utf8-Zeichen bis zu drei Bytes pro Zeichen. Für eine CHAR (255) CHARACTER SET utf8-Spalte muss der Server 255 × 3 = 765 Bytes pro Wert zuweisen. Folglich kann eine Tabelle nicht mehr als 65.535 / 765 = 85 solcher Spalten enthalten.

Der Speicher für Spalten variabler Länge enthält Längenbytes, die anhand der Zeilengröße bewertet werden. Beispielsweise benötigt eine VARCHAR (255) CHARACTER SET utf8-Spalte zwei Bytes, um die Länge des Werts zu speichern, sodass jeder Wert bis zu 767 Bytes aufnehmen kann.

Hier finden Sie INNODB TABLES LIMITATIONS

STT LCU
quelle
10

Varchar hat seine eigenen Grenzen. Versuchen Sie vielleicht, den Datentyp in Text zu ändern.!

Jayesh Amin
quelle
1
Die normale Varchar-Länge beträgt 255, denke ich.
Wikunia
9

Es stellte sich heraus, wie es oft der Fall ist, dass es ein dummer Fehler von meiner Seite war. So wie ich dies getestet habe, habe ich die Abteilungstabelle nicht neu erstellt, nachdem ich den Datentyp von varchar (50) in varchar (200) geändert hatte. Ich habe gerade den Einfügebefehl erneut ausgeführt, immer noch mit der Spalte als varchar (50).

Ben C.
quelle
6

in mysql, wenn Sie nehmen, VARCHARdann ändern Sie es in TEXTbcoz seine Größe ist 65.535 und wenn Sie TEXTdie Änderung bereits mit nehmen können, wenn Sie LONGTEXTdann mehr brauchen 65,535.

Gesamtgröße LONGTEXTist 4,294,967,295Zeichen

Krishna Kumar Jangid
quelle
2

Mit Hibernate können Sie Ihren eigenen UserType erstellen. Das habe ich für dieses Problem getan. So etwas Einfaches:

    public class BytesType implements org.hibernate.usertype.UserType {

         private final int[] SQL_TYPES = new int[] { java.sql.Types.VARBINARY };
     //...
    }

Es gibt natürlich mehr zu implementieren, wenn Sie Ihren eigenen UserType erweitern, aber ich wollte das nur für alle herausbringen, die nach anderen Methoden suchen.

hugh
quelle
2

Sehr alte Frage, aber ich habe alles versucht, was oben vorgeschlagen wurde, und konnte es immer noch nicht lösen.

Es stellte sich heraus, dass ich nach dem Einfügen / Aktualisieren einen Auslöser für die Haupttabelle hatte, der die Änderungen durch Einfügen des Datensatzes in eine Verlaufstabelle mit ähnlicher Struktur verfolgte. Ich habe die Größe in der Haupttabellenspalte erhöht, aber vergessen, die Größe der Verlaufstabellenspalte zu ändern, und das hat das Problem verursacht.

Ich habe ähnliche Änderungen in der anderen Tabelle vorgenommen und der Fehler ist verschwunden.

rahimv
quelle
Ha! Mein Problem auch. Ich habe vergessen, dass ich simple_historydieses Django-Modell habe.
Ross Rogers
1

Ich versuche, eine Tabelle mit einem Feld mit 200 Zeichen zu erstellen, und ich habe zwei Zeilen mit frühen 160 Zeichen hinzugefügt, und es ist in Ordnung. Sind Sie sicher, dass Ihre Zeilen weniger als 200 Zeichen enthalten?

Zeige SqlFiddle

Joe Taras
quelle
Die längste Zeichenfolge besteht aus 143 Zeichen.
Ben C.
1

Wenn Ihre Quelldaten größer als Ihr Zielfeld sind und Sie nur zusätzliche Zeichen abschneiden möchten, aber den strengen Modus nicht deaktivieren oder die Größe des Zielfelds ändern möchten, reduzieren Sie die Daten einfach auf die gewünschte Größe mit LEFT(field_name,size).

INSERT INTO Department VALUES
(..., LEFT('There is some text here',30),...), (..., LEFT('There is some more text over here',30),...);

Ich habe "30" als Beispiel für die Größe Ihres Zielfelds verwendet.

In einigen meiner Codes ist es einfach, die Größe des Zielfelds zu ermitteln und dies zu tun. Aber wenn Ihr Code das schwierig macht, dann gehen Sie mit einer der anderen Antworten.

Buttle Butkus
quelle
0

In meinem Fall trat dieser Fehler auf, weil Daten einen falschen Typ eingegeben haben, zum Beispiel: Wenn es sich um eine lange Typspalte handelt, habe ich versucht, einen Zeichenfolgentyp einzugeben. Überprüfen Sie daher bitte, ob Ihre eingegebenen Daten und Ihre Daten identisch sind oder nicht

havi havish
quelle
0

Für mich habe ich den Spaltentyp als BIT definiert (zB "boolean")

Als ich versuchte, den Spaltenwert "1" über die Benutzeroberfläche (Workbench) festzulegen, wurde der Fehler "Daten zu lang für Spalte" angezeigt.

Es stellt sich heraus, dass es eine spezielle Syntax zum Festlegen von BIT-Werten gibt:

b'1'
Illidan
quelle