Étrange valeur PostgreSQL " trop longue pour varier le caractère du type (500)"
j'ai un Postgres schéma qui ressemble à:
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?
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.
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.)
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 = "";