Données tronquées pour la colonne?


90

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

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

Cependant, j'obtiens une erreur qui n'a pas de sens vu que 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
Quel est le type de données exact après modification?
Joachim Isaksson

3
Êtes-vous sûr que cette colonne a spécifié suffisamment d'espace pour du texte de cette longueur?
John Conde

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

Commentaire précédent supprimé en raison de EDIT: Je n'ai pas spécifié que la chaîne devrait être char (34) au lieu de char (1), mais je ne sais pas comment faire
Zagstrug

STRINGn'est pas un type MySQL. Quel est votre moteur de base de données?
RandomSeed

Réponses:


83

Votre problème est qu'au moment où votre incoming_Cidcolonne est définie comme CHAR(1)quand elle devrait l'être CHAR(34).

Pour résoudre ce problème, lancez simplement cette commande pour changer la longueur de vos colonnes de 1 à 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Voici la démo de SQLFiddle


13

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'essayais d'enregistrer la valeur 'a' dans cette colonne, j'ai donc obtenu le mentionné Erreur.

Résolu en modifiant la définition de la colonne de table et la valeur ajoutée «a» dans l'ensemble d'énumérations.


8

En émettant cette déclaration:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... vous avez omis le paramètre de 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);

5

Cependant, j'obtiens une erreur qui n'a pas de sens vu que 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 recevoir ce message lorsque vous faites quelque chose comme ce qui suit:

REPLACE INTO table2 (SELECT * FROM table1);

Résultat dans notre cas 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é une tinyinttentative de stockage dans un datetimechamp ou vice versa.


1

Dans mon cas, c'était une table avec un ENUM qui accepte les jours de la semaine comme des entiers (0 à 6). Lors de l'insertion de la valeur 0 en tant qu'entier, j'ai reçu le message d'erreur "Données tronquées pour la colonne ...", donc pour le réparer, j'ai dû convertir l'entier en une chaîne. Donc au lieu de:

$item->day = 0;

Je devais faire;

$item->day = (string) 0;

Cela a l'air idiot de lancer le zéro comme ça, mais dans mon cas, c'était dans une usine Laravel, et j'ai dû l'écrire comme ceci:

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

1

quand j'ai essayé d'importer csv dans mysql pour la première fois, j'ai eu la même erreur, puis j'ai compris que la table mysql que j'avais créée n'avait pas la longueur de caractère du champ csv importé, donc si c'est la première fois que vous importez du csv

  1. c'est une bonne idée de donner plus de longueur de caractère.
  2. étiqueter tous les champs comme varcharou text, ne pas mélanger intou d'autres valeurs.

Alors tu peux y aller.


0

J'ai eu le même problème, avec un champ de base de données avec le type "SET" qui est un type enum.

J'ai essayé d'ajouter une valeur qui ne figurait pas dans cette liste.

La valeur que j'ai essayé d'ajouter avait la valeur décimale 256, mais la liste d'énumération n'avait que 8 valeurs.

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

Je devais donc juste ajouter la valeur supplémentaire au champ.

entrez la description de l'image ici

La lecture de cette entrée de documentation m'a aidé à comprendre le problème.

MySQL stocke les valeurs SET numériquement, le bit de poids faible de la valeur stockée correspondant au premier membre de l'ensemble. Si vous récupérez une valeur SET dans un contexte numérique, la valeur récupérée a des bits définis correspondant aux membres de l'ensemble qui composent la valeur de colonne. Par exemple, vous pouvez récupérer des valeurs numériques à partir d'une colonne SET comme ceci:

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

Si un nombre est stocké dans une colonne SET, les bits définis dans la représentation binaire du nombre déterminent les membres de l'ensemble dans la valeur de colonne. Pour une colonne spécifiée comme SET ('a', 'b', 'c', 'd'), les membres ont les valeurs décimales et binaires suivantes.

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

Si vous affectez une valeur de 9 à cette colonne, c'est-à-dire 1001 en binaire, les premier et quatrième membres de valeur SET «a» et «d» sont sélectionnés et la valeur résultante est «a, d».

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.