100 votes

Étrange PostgreSQL "valeur trop longue pour le type caractère varying(500)"

Je possède un schéma Postgres qui ressemble à ceci :

entrer la description de l'image ici

Le problème est que chaque fois que je sauvegarde un texte de plus de 500 caractères dans la colonne description, j'obtiens l'erreur :

valeur trop longue pour le type character varying(500)

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

J'utilise postgresql-9.1.

Cette table a été générée en utilisant Django 1.4 et le type de champ dans le modèle est TextField, si cela aide à expliquer davantage le problème.

Des idées sur pourquoi cela se produit et que puis-je faire pour le résoudre ?

67voto

Craig Ringer Points 72371

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

Si vous ne voulez pas de limite, utilisez un VARCHAR non qualifié, ou utilisez le type TEXT.

VARCHAR et TEXT sont limités en longueur uniquement par les limites système sur la taille de la colonne - environ 1 Go - et par votre mémoire. Cependant, ajouter un qualificateur de longueur à VARCHAR définira manuellement une limite plus petite. Tous les exemples 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 sont dans la façon dont les métadonnées de la base de données sont rapportées et quel SQLSTATE est soulevé lorsque la contrainte est violée.

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

regress => \x
L'affichage étendu est activé.
regress => PRÉPARE t2(varchar(500)) COMME SÉLECTIONNER $1;
PRÉPARER
regress => EXÉCUTER t2( repeat('x',601) );
-[ RECORD 1 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
?column? | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

et dans les conversions explicites, cela aboutit à une troncature :

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

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

20voto

Scott S Points 2329

Character varying est différent de texte. Essayez d'exécuter

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 l'atteindriez probablement jamais en réalité.)

7voto

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

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

0voto

Erfan Kazemi Points 19

Mon problème était que j'avais des données dans ma table, donc PostgreSQL ne me permettait pas de faire des changements sur ma table !

changez-la pour une valeur plus grande !

0voto

Peter Kam Points 53

J'ai eu le même problème. Dans mon cas, je suis allé à pgAdmin>Schemas>Tables>blog_post puis j'ai cliqué sur la flèche pour accéder aux 'Colonnes' et j'ai trouvé la colonne, character varing(25). Faites un clic droit puis allez dans Propriétés, cliquez sur 'Définition'. Enfin, j'ai vu 'Longueur/Précision'. J'ai changé 25 en 50. Et voilà. Tout va bien.


Une fois de plus, vous devez modifier la taille de votre colonne. Allez à pgAdmin>Schemas>Tables>(le nom de votre modèle d'application)>Colonnes>(la colonne sur laquelle vous avez un problème)>Définition>Longueur Augmentez la taille. C'est tout!!!

Bonne chance!

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