web-dev-qa-db-fra.com

Strange PostgreSQL "valeur trop longue pour le caractère de type variant (500)"

J'ai un schéma Postgres qui ressemble à:

enter image description here

Le problème est que chaque fois que j'enregistre un texte de plus de 500 caractères dans la colonne de description, le message d'erreur suivant s'affiche:

value too long for type character varying(500)

Dans la documentation de Postgres, il est dit que le texte de type peut avoir un nombre illimité de caractères.

J'utilise postgresql-9.1.

Ce tableau a été généré à l'aide de Django 1.4 et le type de champ dans le modèle est TextField, si cela permet d'expliquer davantage le problème.

Des idées comme pourquoi cela se passe et ce que je peux faire pour y remédier?

29
Parham

En spécifiant la colonne en tant que VARCHAR(500), vous définissez une limite explicite de 500 caractères. Vous ne l’avez peut-être pas fait explicitement, mais Django l’a fait quelque part pour vous. Vous dire où est difficile lorsque vous n'avez pas montré votre modèle, le texte d'erreur complet ou la requête qui a généré l'erreur.

Si vous n'en voulez pas, utilisez une VARCHAR non qualifiée ou utilisez le type TEXT.

varchar et text sont limités en longueur uniquement par les limites système imposées à la taille des colonnes - environ 1 Go - et par votre mémoire. Cependant, l'ajout d'un qualificateur de longueur à varchar définit manuellement une limite inférieure. Tous les éléments suivants sont largement équivalents:

column_name VARCHAR(500)

column_name VARCHAR CHECK (length(column_name) <= 500) 

column_name TEXT CHECK (length(column_name) <= 500) 

Les seules différences concernent la manière dont les métadonnées de la base de données sont signalées et le type de requête SQLSTATE qui est généré lorsque la contrainte est violée.

La contrainte de longueur n'est généralement pas respectée dans les paramètres d'instructions préparées, les appels de fonction, etc., comme indiqué:

regress=> \x
Expanded display is on.
regress=> PREPARE t2(varchar(500)) AS SELECT $1;
PREPARE
regress=> EXECUTE t2( repeat('x',601) );
-[ RECORD 1 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
?column? | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

et dans des castes explicites, il en résulte une troncature:

regress=> SELECT repeat('x',501)::varchar(1);
-[ RECORD 1 ]
repeat | x

je pense donc que vous utilisez une colonne VARCHAR(500) et que vous vous trouvez dans la mauvaise table ou dans la mauvaise instance de la base de données.

24
Craig Ringer

La variation de caractère est différente du texte. Essayez de courir 

ALTER TABLE product_product ALTER COLUMN code TYPE text;

Cela changera le type de colonne en texte, qui est limité à une très grande quantité de données (vous ne le feriez probablement jamais réellement).

6
Scott S

Nous avons eu le même problème. Nous l'avons résolu en ajoutant 'longueur' à la définition d'attribut d'entité:

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 
1