web-dev-qa-db-fra.com

"Données trop longues pour la colonne" - pourquoi?

J'ai écrit un script MySQL afin de créer une base de données pour les dossiers d'hôpitaux hypothétiques et de la remplir avec des données. L'une des tables, Department, possède une colonne nommée Description, déclarée sous le type varchar (200). Lors de l'exécution de la commande INSERT pour Description, le message d'erreur 1406: Data too long for column 'Description' at row 1. Toutes les chaînes que j'insère comptent moins de 150 caractères.

Voici la déclaration:
CREATE TABLE Department(
...
Description varchar(200)
...);


Et voici la commande d'insertion:
INSERT INTO Department VALUES
(..., 'There is some text here',...), (..., 'There is some more text over here',...);


De toute évidence, cela devrait fonctionner. Quelqu'un a un aperçu?

39
Ben C.

J'ai eu un problème similaire lors de la migration d'une ancienne base de données vers une nouvelle version.

Basculez le mode MySQL pour ne pas utiliser STRICT.

SET @@global.sql_mode= 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Code d'erreur: 1406. Données trop longues pour la colonne - MySQL

37
Claudionor Oliveira

Changez le type de colonne en LONGTEXT

36
Alexander Serkin

Il existe une limite stricte au nombre de données pouvant être stockées dans une seule ligne d'une table mysql, quel que soit le nombre de colonnes ou la longueur de chaque colonne.

Comme indiqué dans le DOCUMENTATION OFFICIELLE

La taille maximale des lignes limite le nombre (et éventuellement la taille) des colonnes car la longueur totale de toutes les colonnes ne peut pas dépasser cette taille. Par exemple, les caractères utf8 nécessitent jusqu'à trois octets par caractère. Par conséquent, pour une colonne CHAR (255) CHARACTER SET utf8, le serveur doit allouer 255 × 3 = 765 octets par valeur. Par conséquent, une table ne peut pas contenir plus de 65 535/765 = 85 colonnes.

Le stockage des colonnes de longueur variable inclut des octets de longueur, qui sont évalués par rapport à la taille de la ligne. Par exemple, une colonne VARCHAR (255) CHARACTER SET utf8 nécessite deux octets pour stocker la longueur de la valeur. Ainsi, chaque valeur peut prendre jusqu'à 767 octets.

Ici vous pouvez trouver INNODB TABLES LIMITATIONS

14
STT LCU

Il s'avère que, comme c'est souvent le cas, c'était une erreur stupide de ma part. En testant cela, je ne reconstruisais pas la table Department après avoir changé le type de données de varchar (50) à varchar (200); Je venais juste de relancer la commande insert, toujours avec la colonne varchar (50).

8
Ben C.

Varchar a ses propres limites. Essayez peut-être de changer le type de données en texte.!

5
Jayesh Amin

Avec Hibernate, vous pouvez créer votre propre UserType. C'est donc ce que j'ai fait pour ce problème. Quelque chose d'aussi simple que cela:

    public class BytesType implements org.hibernate.usertype.UserType {

         private final int[] SQL_TYPES = new int[] { Java.sql.Types.VARBINARY };
     //...
    }

Bien sûr, il y a plus à implémenter en étendant votre propre UserType, mais je voulais juste le proposer à ceux qui recherchent d'autres méthodes.

3
hugh

J'essaie de créer une table avec un champ de 200 caractères et j'ai ajouté deux lignes avec 160 premiers caractères et c'est OK Êtes-vous sûr que vos lignes contiennent moins de 200 caractères?

Afficher SqlFiddle

1
Joe Taras

Dans mon cas, cette erreur est due à la saisie d’un type incorrect dans les données, par exemple: s’il s’agit d’une colonne de type long, j’ai essayé de saisir un type de chaîne. alors s'il vous plaît vérifier vos données que vous entrez et tapez sont identiques ou non

0
havi havish

Si vos données source sont plus volumineuses que votre champ cible et que vous souhaitez simplement supprimer tous les caractères supplémentaires, mais que vous ne souhaitez pas désactiver le mode strict ou modifier la taille du champ cible, réduisez simplement les données à la taille dont vous avez besoin. avec LEFT(field_name,size).

INSERT INTO Department VALUES
(..., LEFT('There is some text here',30),...), (..., LEFT('There is some more text over here',30),...);

J'ai utilisé "30" comme exemple de la taille de votre champ cible.

Dans certains de mes codes, il est facile de connaître la taille du champ cible. Mais si votre code rend cela difficile, choisissez une des autres réponses.

0
Buttle Butkus