144 votes

Données tronquées pour une colonne ?

Après avoir changé le type de données d'une colonne MySql afin de stocker Appel Twilio (chaînes de 34 caractères), j'essaie de modifier manuellement les données de cette colonne avec :

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

Cependant, je reçois une erreur qui n'a pas de sens puisque le type de données de la colonne a été correctement modifié ?

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

2 votes

Quel est le type de données exact après modification ?

3 votes

Êtes-vous sûr que cette colonne a spécifié suffisamment de place pour un texte de cette longueur ?

1 votes

ALTER TABLES calls MODIFY incoming_Cid STRING; c'est ce que j'ai fait.

126voto

peterm Points 72466

Votre problème est qu'au moment où votre incoming_Cid colonne définie comme CHAR(1) alors qu'il devrait être CHAR(34) .

Pour résoudre ce problème, il suffit de lancer cette commande pour modifier la longueur de vos colonnes de 1 à 34.

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Voici SQLFiddle demo

2 votes

J'envoyais String pour ENUM au lieu d'entiers.

0 votes

J'ai obtenu l'erreur en appelant ceci : ALTER TABLE properties CHANGE verpackt verpackt FLOAT( 10, 3 ) NOT NULL DEFAULT '0.000' - avant qu'il ne soit FLOAT( 8, 3 ) NULL - Le problème est qu'il y a déjà des valeurs dans "verpackt", donc la suppression du NULL n'est pas possible.

0 votes

J'ai obtenu cette erreur en essayant de définir un champ entier à "11 kg" . Je crois qu'une version antérieure de MySQL a converti silencieusement cette valeur en 11 .

33voto

MTurPash Points 809

J'ai eu le même problème à cause d'une colonne de table qui était définie comme ENUM('x','y','z') et plus tard j'ai essayé de sauvegarder la valeur 'a' dans cette colonne, donc j'ai eu l'erreur mentionnée.

Résolu en modifiant la définition de la colonne de la table et en ajoutant la valeur 'a' dans l'ensemble de l'énumération.

10voto

RandomSeed Points 14960

En publiant cette déclaration :

ALTER TABLES call MODIFY incoming_Cid CHAR;

... vous avez omis le paramètre de la longueur. Votre requête était donc équivalente à :

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

Vous devez spécifier la taille du champ pour les tailles supérieures à 1 :

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);

6voto

Gray Points 58585

Cependant, je reçois une erreur qui n'a pas de sens puisque le type de données de la colonne a été correctement modifié ?

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

Vous pouvez souvent obtenir ce message lorsque vous faites quelque chose comme ce qui suit :

REPLACE INTO table2 (SELECT * FROM table1);

Dans notre cas, cela a donné lieu à l'erreur suivante :

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

Le problème s'est avéré être un désalignement de colonne qui a entraîné un tinyint essayant d'être stocké dans un datetime ou vice versa.

1voto

iSWORD Points 446

Dans mon cas, il s'agissait d'une table avec un ENUM qui accepte les jours de la semaine sous forme d'entiers (0 à 6). Lorsque j'ai inséré la valeur 0 en tant qu'entier, j'ai obtenu le message d'erreur "Data truncated for column ...". Pour résoudre ce problème, j'ai dû convertir l'entier en chaîne de caractères. Ainsi, au lieu de :

$item->day = 0;

Je devais le faire ;

$item->day = (string) 0;

Cela semble stupide de mettre le zéro comme ça, mais dans mon cas, il s'agissait d'une usine Laravel, et j'ai dû l'écrire comme ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X