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

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

enter image description here

le problème est que chaque fois que je sauve du texte plus long que 500 caractères dans la colonne description je reçois l'erreur:

value too long for type character varying(500)

dans la documentation pour Postgres il est dit que le texte de type peut avoir des caractères illimités.

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 expliquez davantage le problème.

avez-vous une idée de pourquoi cela se produit et de ce que je peux faire pour y remédier?

25
demandé sur Parham 2012-11-21 05:28:49

3 réponses

En spécifiant la colonne VARCHAR(500) vous avez défini une limite explicite de 500 caractères. Vous pourriez ne pas avoir fait vous-même explicitement, mais Django a fait pour vous quelque part. Vous dire où est dur quand vous n'avez pas montré votre modèle, le texte complet de l'erreur, ou la requête qui a produit l'erreur.

Si vous n'en voulez pas, utilisez un franc VARCHAR, ou TEXT type.

varchar et text ont une longueur limitée seulement par les limites du système sur taille de la colonne-environ 1 Go - et par votre mémoire. Cependant, ajouter un qualificatif de longueur à varchar fixe une limite plus petite manuellement. Tous les éléments suivants sont largement équivalentes:

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 d'instruction préparés, les appels de fonction, etc., comme indiqué:

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

et en explicite il jette résultat de la troncature:

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

je pense donc que vous à l'aide d'un VARCHAR(500) colonne, et vous regardez la mauvaise table ou la mauvaise instance de la base de données.

22
répondu Craig Ringer 2012-11-21 01:56:05

la variation des caractères est différente du texte. Essayez d'exécuter

ALTER TABLE product_product ALTER COLUMN code TYPE text;

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

6
répondu Scott S 2012-11-21 01:33:24

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

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 
1
répondu Marco Lucio Lorenzotti 2018-02-20 11:46:18