Dati troncati per colonna?


92

Dopo aver modificato il tipo di dati di una colonna MySql per memorizzare gli ID delle chiamate Twilio (34 stringhe di caratteri), provo a modificare manualmente i dati in quella colonna con:

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

Tuttavia ricevo un errore che non ha senso visto che il tipo di dati della colonna è stato modificato correttamente?

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


2
Qual è il tipo di dati esatto dopo la modifica?
Joachim Isaksson

3
Sei sicuro che la colonna abbia specificato spazio sufficiente per il testo di quella lunghezza?
John Conde

1
ALTER TABLES calls MODIFY incoming_Cid STRING;è quello che ho fatto.
Zagstrug

Commento precedente eliminato a causa di EDIT: non ho specificato che la stringa dovrebbe essere char (34) invece di char (1), ma non so come farlo
Zagstrug

STRINGnon è un tipo MySQL. Qual è il tuo motore di database?
RandomSeed

Risposte:


86

Il tuo problema è che al momento la tua incoming_Cidcolonna ha definito come CHAR(1)dovrebbe essere CHAR(34).

Per risolvere questo problema, emetti questo comando per modificare la lunghezza delle colonne da 1 a 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Ecco la demo di SQLFiddle


13

Ho avuto lo stesso problema a causa di una colonna della tabella definita come ENUM ('x', 'y', 'z') e in seguito stavo cercando di salvare il valore 'a' in questa colonna, quindi ho ottenuto il menzionato errore.

Risolto modificando la definizione della colonna della tabella e il valore aggiunto "a" nel set enum.


9

Emettendo questa dichiarazione:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... hai omesso il parametro length. La tua richiesta era quindi equivalente a:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

È necessario specificare la dimensione del campo per le dimensioni maggiori di 1:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

5

Tuttavia ricevo un errore che non ha senso visto che il tipo di dati della colonna è stato modificato correttamente?

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

Spesso puoi ricevere questo messaggio quando stai facendo qualcosa di simile:

REPLACE INTO table2 (SELECT * FROM table1);

Nel nostro caso è risultato il seguente errore:

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

Il problema si è rivelato essere un disallineamento della colonna che ha provocato un tinyinttentativo di memorizzazione in un datetimecampo o viceversa.


1

Nel mio caso era una tabella con un ENUM che accetta i giorni della settimana come numeri interi (da 0 a 6). Quando inserivo il valore 0 come numero intero ho ricevuto il messaggio di errore "Dati troncati per colonna ..." quindi per risolverlo ho dovuto eseguire il cast dell'intero su una stringa. Quindi invece di:

$item->day = 0;

Ho dovuto fare;

$item->day = (string) 0;

Sembra sciocco lanciare lo zero in quel modo, ma nel mio caso era in una fabbrica Laravel, e ho dovuto scriverlo in questo modo:

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

1

quando ho provato per la prima volta ad importare csv in mysql, ho ricevuto lo stesso errore, e poi ho capito che la tabella mysql che ho creato non ha la lunghezza del carattere del campo csv di importazione, quindi se è la prima volta che importa csv

  1. è una buona idea dare più lunghezza ai caratteri.
  2. etichettare tutti i campi come varcharo text, non unire into altri valori.

allora sei a posto.


0

Ho avuto lo stesso problema, con un campo database con tipo "SET" che è un tipo enum.

Ho provato ad aggiungere un valore che non era in quella lista.

Il valore che ho provato ad aggiungere aveva il valore decimale 256, ma l'elenco enum aveva solo 8 valori.

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

Quindi ho dovuto solo aggiungere il valore aggiuntivo al campo.

inserisci qui la descrizione dell'immagine

La lettura di questa voce di documentazione mi ha aiutato a capire il problema.

MySQL memorizza i valori SET numericamente, con il bit di ordine inferiore del valore memorizzato corrispondente al primo membro del set. Se si recupera un valore SET in un contesto numerico, il valore recuperato ha set di bit corrispondenti ai membri del set che costituiscono il valore della colonna. Ad esempio, puoi recuperare valori numerici da una colonna SET come questa:

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

Se un numero viene memorizzato in una colonna SET, i bit impostati nella rappresentazione binaria del numero determinano i membri del set nel valore della colonna. Per una colonna specificata come SET ('a', 'b', 'c', 'd'), i membri hanno i seguenti valori decimali e binari.

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

Se si assegna un valore di 9 a questa colonna, questo è 1001 in binario, quindi il primo e il quarto membro del valore SET "a" e "d" vengono selezionati e il valore risultante è "a, d".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.