¿Datos truncados para la columna?

90

Después de cambiar el tipo de datos de una columna MySql para almacenar los identificadores de llamadas de Twilio (34 cadenas de caracteres), trato de cambiar manualmente los datos en esa columna con:

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

Sin embargo, aparece un error que no tiene sentido, ya que el tipo de datos de la columna se modificó correctamente.

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

Zagstrug
fuente
2
¿Cuál es el tipo de datos exacto después de la modificación?
Joachim Isaksson
3
¿Está seguro de que la columna ha especificado suficiente espacio para texto de esa longitud?
John Conde
1
ALTER TABLES calls MODIFY incoming_Cid STRING;es lo que hice.
Zagstrug
Comentario anterior eliminado debido a EDITAR: no he especificado que la cadena debe ser char (34) en lugar de char (1), pero no sé cómo hacerlo
Zagstrug
STRINGno es un tipo MySQL. ¿Cuál es su motor de base de datos?
RandomSeed

Respuestas:

83

Tu problema es que de momento tu incoming_Cidcolumna define como CHAR(1)debe ser CHAR(34).

Para solucionar esto, simplemente emita este comando para cambiar la longitud de sus columnas de 1 a 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Aquí está la demostración de SQLFiddle

peterm
fuente
13

Tuve el mismo problema debido a una columna de la tabla que se definió como ENUM ('x', 'y', 'z') y luego estaba tratando de guardar el valor 'a' en esta columna, así obtuve el mencionado error.

Resuelto modificando la definición de la columna de la tabla y el valor agregado 'a' en el conjunto de enumeración.

MTurPash
fuente
8

Al emitir esta declaración:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... omitiste el parámetro de longitud. Por lo tanto, su consulta fue equivalente a:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

Debe especificar el tamaño del campo para tamaños superiores a 1:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);
Semilla aleatoria
fuente
5

Sin embargo, aparece un error que no tiene sentido, ya que el tipo de datos de la columna se modificó correctamente.

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

A menudo puede recibir este mensaje cuando está haciendo algo como lo siguiente:

REPLACE INTO table2 (SELECT * FROM table1);

En nuestro caso resultó en el siguiente error:

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

El problema resultó ser una desalineación de la columna que resultó en un tinyintintento de ser almacenado en un datetimecampo o viceversa.

gris
fuente
1

En mi caso se trató de una tabla con un ENUM que acepta los días de la semana como enteros (0 a 6). Al insertar el valor 0 como un número entero, recibí el mensaje de error "Datos truncados para la columna ...", así que para solucionarlo tuve que convertir el número entero en una cadena. Entonces en lugar de:

$item->day = 0;

Tenía que hacer;

$item->day = (string) 0;

Parece una tontería lanzar el cero así, pero en mi caso fue en una fábrica de Laravel, y tuve que escribirlo así:

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

cuando intenté importar csv a mysql por primera vez, obtuve el mismo error, y luego descubrí que la tabla mysql que creé no tiene la longitud de caracteres del campo csv de importación, así que si es la primera vez que importa csv

  1. es una buena idea dar más longitud a los caracteres.
  2. etiquetar todos los campos como varcharo text, no mezclar intu otros valores.

Entonces, ya puedes irte.

Saidjon
fuente
0

Tuve el mismo problema, con un campo de base de datos con el tipo "SET", que es un tipo de enumeración.

Intenté agregar un valor que no estaba en esa lista.

El valor que intenté agregar tenía el valor decimal 256, pero la lista de enumeración solo tenía 8 valores.

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

Así que solo tuve que agregar el valor adicional al campo.

ingrese la descripción de la imagen aquí

La lectura de esta entrada de documentación me ayudó a comprender el problema.

MySQL almacena los valores SET numéricamente, con el bit de orden inferior del valor almacenado correspondiente al primer miembro del conjunto. Si recupera un valor SET en un contexto numérico, el valor recuperado tiene un conjunto de bits correspondiente a los miembros del conjunto que componen el valor de la columna. Por ejemplo, puede recuperar valores numéricos de una columna SET como esta:

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

Si un número se almacena en una columna SET, los bits que se establecen en la representación binaria del número determinan los miembros del conjunto en el valor de la columna. Para una columna especificada como SET ('a', 'b', 'c', 'd'), los miembros tienen los siguientes valores decimales y binarios.

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

Si asigna un valor de 9 a esta columna, es decir 1001 en binario, entonces se seleccionan el primer y cuarto miembros del valor SET 'a' y 'd' y el valor resultante es 'a, d'.

Negro
fuente