Dane w kolumnie zostały obcięte?

90

Po zmianie typu danych kolumny MySql w celu przechowywania identyfikatorów wywołań Twilio (34 ciągi znaków), próbuję ręcznie zmienić dane w tej kolumnie za pomocą:

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

Jednak pojawia się błąd, który nie ma sensu, ponieważ typ danych kolumny został poprawnie zmodyfikowany?

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

Zagstrug
źródło
2
Jaki jest dokładny typ danych po modyfikacji?
Joachim Isaksson
3
Czy na pewno w kolumnie określono wystarczająco dużo miejsca na tekst o tej długości?
John Conde
1
ALTER TABLES calls MODIFY incoming_Cid STRING;jest tym, co zrobiłem.
Zagstrug,
Usunięto poprzedni komentarz z powodu EDYCJI: nie określiłem, że ciąg powinien być char (34) zamiast char (1), ale nie wiem, jak to zrobić
Zagstrug
STRINGnie jest typem MySQL. Jaki jest Twój silnik bazy danych?
RandomSeed

Odpowiedzi:

83

Twoim problemem jest to, że w tej chwili Twoja incoming_Cidkolumna została zdefiniowana tak, jak CHAR(1)powinna CHAR(34).

Aby to naprawić, po prostu wydaj to polecenie, aby zmienić długość kolumn z 1 na 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Oto demo SQLFiddle

peterm
źródło
13

Miałem ten sam problem z powodu kolumny tabeli, która została zdefiniowana jako ENUM ('x', 'y', 'z') i później próbowałem zapisać wartość 'a' w tej kolumnie, więc otrzymałem wspomniany błąd.

Rozwiązany przez zmianę definicji kolumny tabeli i dodanie wartości „a” do zestawu wyliczeń.

MTurPash
źródło
8

Wydając to oświadczenie:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... pominąłeś parametr długości. Twoje zapytanie było zatem równoważne z:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

W przypadku rozmiarów większych niż 1 musisz określić rozmiar pola:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);
RandomSeed
źródło
5

Jednak pojawia się błąd, który nie ma sensu, ponieważ typ danych kolumny został poprawnie zmodyfikowany?

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

Często możesz otrzymać tę wiadomość, gdy robisz coś takiego:

REPLACE INTO table2 (SELECT * FROM table1);

W naszym przypadku wystąpił następujący błąd:

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

Problemem okazała się niewspółosiowość kolumn, która skutkowała tinyintpróbą przechowywania w datetimepolu lub odwrotnie.

Szary
źródło
1

W moim przypadku była to tabela z wartością ENUM, która przyjmuje dni tygodnia jako liczby całkowite (od 0 do 6). Podczas wstawiania wartości 0 jako liczby całkowitej otrzymałem komunikat o błędzie „Dane obcięte dla kolumny ...”, więc aby to naprawić, musiałem rzucić liczbę całkowitą na łańcuch. Więc zamiast:

$item->day = 0;

Musiałem zrobić;

$item->day = (string) 0;

To wygląda głupio, aby rzucić zero w ten sposób, ale w moim przypadku było to w fabryce Laravel i musiałem napisać to tak:

$factory->define(App\Schedule::class, function (Faker $faker) {
    return [
        'day' => (string) $faker->numberBetween(0, 6),
        //
    ];
});
iSWORD
źródło
1

kiedy po raz pierwszy próbowałem zaimportować csv do mysql, dostałem ten sam błąd, a potem zorientowałem się, że utworzona przeze mnie tabela mysql nie ma długości znaków importowanego pola csv, więc jeśli jest to pierwszy raz, gdy importujesz csv

  1. to dobry pomysł, aby nadać więcej znaków.
  2. oznacz wszystkie pola jako varcharlub text, nie mieszaj intlub inne wartości.

wtedy jesteś gotowy.

Saidjon
źródło
0

Miałem ten sam problem, z polem bazy danych typu „SET”, które jest typem wyliczenia.

Próbowałem dodać wartość, której nie było na tej liście.

Wartość, którą próbowałem dodać, miała wartość dziesiętną 256, ale lista wyliczeń miała tylko 8 wartości.

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

Musiałem więc po prostu dodać dodatkową wartość do pola.

wprowadź opis obrazu tutaj

Przeczytanie tego wpisu dokumentacji pomogło mi zrozumieć problem.

MySQL przechowuje wartości SET w postaci numerycznej, przy czym najmniejszy bit przechowywanej wartości odpowiada pierwszemu elementowi zestawu. Jeśli pobierasz wartość SET w kontekście liczbowym, pobrana wartość ma ustawione bity odpowiadające elementom zestawu, które tworzą wartość kolumny. Na przykład możesz pobrać wartości liczbowe z kolumny SET w następujący sposób:

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

Jeśli liczba jest przechowywana w kolumnie SET, bity ustawione w binarnej reprezentacji liczby określają elementy zestawu w wartości kolumny. W przypadku kolumny określonej jako SET („a”, „b”, „c”, „d”) składowe mają następujące wartości dziesiętne i binarne.

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

Jeśli przypiszesz do tej kolumny wartość 9, czyli 1001 w systemie dwójkowym, wybierane są pierwsze i czwarte elementy składowe wartości SET, „a” i „d”, a wynikowa wartość to „a, d”.

czarny
źródło