Daten für Spalte abgeschnitten?


89

Nachdem ich den Datentyp einer MySql-Spalte geändert habe, um Twilio-Anruf- IDs (34 Zeichenfolgen) zu speichern , versuche ich, die Daten in dieser Spalte manuell zu ändern mit:

update calls 
   set incoming_Cid='CA9321a83241035b4c3d3e7a4f7aa6970d' 
 where id='1';

Ich erhalte jedoch eine Fehlermeldung, die keinen Sinn ergibt, da der Datentyp der Spalte ordnungsgemäß geändert wurde.

| Level ||| Code | Message | Warning | 1265 | Data truncated for column 'incoming_Cid' at row 1


2
Was ist der genaue Datentyp nach der Änderung?
Joachim Isaksson

2
Sind Sie sicher, dass in der Spalte genügend Platz für Text dieser Länge angegeben ist?
John Conde

1
ALTER TABLES calls MODIFY incoming_Cid STRING;ist was ich getan habe.
Zagstrug

Vorheriger Kommentar aufgrund von EDIT gelöscht: Ich habe nicht angegeben, dass die Zeichenfolge char (34) anstelle von char (1) sein soll, weiß aber nicht, wie das geht
Zagstrug

STRINGist kein MySQL-Typ. Was ist Ihre Datenbank-Engine?
RandomSeed

Antworten:


80

Ihr Problem ist, dass Ihre incoming_CidSpalte im Moment so definiert ist, wie CHAR(1)sie sein sollte CHAR(34).

Um dies zu beheben, geben Sie einfach diesen Befehl ein, um die Länge Ihrer Spalten von 1 auf 34 zu ändern

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Hier ist die SQLFiddle- Demo


12

Ich hatte das gleiche Problem aufgrund einer Tabellenspalte, die als ENUM ('x', 'y', 'z') definiert war, und später versuchte ich, den Wert 'a' in dieser Spalte zu speichern, daher erhielt ich die erwähnte Error.

Gelöst durch Ändern der Tabellenspaltendefinition und des Mehrwerts 'a' in der Aufzählungsmenge.


7

Mit dieser Erklärung:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... Sie haben den Längenparameter weggelassen. Ihre Anfrage war daher gleichbedeutend mit:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

Sie müssen die Feldgröße für Größen größer als 1 angeben:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

5

Ich erhalte jedoch eine Fehlermeldung, die keinen Sinn ergibt, da der Datentyp der Spalte ordnungsgemäß geändert wurde.

| Level | Code | Msg | Warn | 12 | Data truncated for column 'incoming_Cid' at row 1

Sie können diese Meldung häufig erhalten, wenn Sie Folgendes tun:

REPLACE INTO table2 (SELECT * FROM table1);

In unserem Fall ergab sich folgender Fehler:

SQL Exception: Data truncated for column 'level' at row 1

Das Problem stellte sich als Spaltenfehlausrichtung heraus, die dazu führte, dass tinyintversucht wurde, in einem datetimeFeld gespeichert zu werden oder umgekehrt.


1

In meinem Fall war es eine Tabelle mit einer ENUM, die die Wochentage als Ganzzahlen (0 bis 6) akzeptiert. Beim Einfügen des Werts 0 als Ganzzahl wurde die Fehlermeldung "Daten für Spalte abgeschnitten ..." angezeigt. Um dies zu beheben, musste die Ganzzahl in eine Zeichenfolge umgewandelt werden. Also statt:

$item->day = 0;

Ich musste es tun;

$item->day = (string) 0;

Es sieht albern aus, die Null so zu werfen, aber in meinem Fall war es in einer Laravel-Fabrik, und ich musste es so schreiben:

$factory->define(App\Schedule::class, function (Faker $faker) {
    return [
        'day' => (string) $faker->numberBetween(0, 6),
        //
    ];
});

1

Als ich zum ersten Mal versuchte, CSV in MySQL zu importieren, bekam ich den gleichen Fehler und dann stellte ich fest, dass die von mir erstellte MySQL-Tabelle nicht die Zeichenlänge des importierenden CSV-Felds hat. Wenn es also das erste Mal ist, dass CSV importiert wird

  1. Es ist eine gute Idee, mehr Zeichenlänge zu geben.
  2. Beschriften Sie alle Felder als varcharoder text, nicht mischen intoder andere Werte.

dann bist du gut zu gehen.


0

Ich hatte das gleiche Problem mit einem Datenbankfeld vom Typ "SET", das ein Aufzählungstyp ist.

Ich habe versucht, einen Wert hinzuzufügen, der nicht in dieser Liste enthalten ist.

Der Wert, den ich hinzufügen wollte, hatte den Dezimalwert 256, aber die Aufzählungsliste hatte nur 8 Werte.

1: 1   -> A
2: 2   -> B
3: 4   -> C
4: 8   -> D
5: 16  -> E
6: 32  -> F
7: 64  -> G
8: 128 -> H

Also musste ich dem Feld nur den zusätzlichen Wert hinzufügen.

Geben Sie hier die Bildbeschreibung ein

Das Lesen dieses Dokumentationseintrags hat mir geholfen, das Problem zu verstehen.

MySQL speichert SET-Werte numerisch, wobei das niederwertige Bit des gespeicherten Werts dem ersten gesetzten Element entspricht. Wenn Sie einen SET-Wert in einem numerischen Kontext abrufen, werden für den abgerufenen Wert Bits gesetzt, die den gesetzten Elementen entsprechen, aus denen der Spaltenwert besteht. Sie können beispielsweise numerische Werte aus einer SET-Spalte wie folgt abrufen:

mysql> SELECT set_col+0 FROM tbl_name; If a number is stored into a

Wenn eine Zahl in einer SET-Spalte gespeichert ist, bestimmen die Bits, die in der binären Darstellung der Zahl gesetzt sind, die gesetzten Elemente im Spaltenwert. Für eine als SET angegebene Spalte ('a', 'b', 'c', 'd') haben die Elemente die folgenden Dezimal- und Binärwerte.

SET Member  Decimal Value   Binary Value
    'a'                1          0001
    'b'                2          0010
    'c'                4          0100
    'd'                8          1000

Wenn Sie dieser Spalte einen Wert von 9 zuweisen, dh 1001 in Binärform, werden die ersten und vierten SET-Wertelemente 'a' und 'd' ausgewählt und der resultierende Wert ist 'a, d'.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.