it-swarm.com.de

Strange PostgreSQL "Wert zu lang für Typzeichen (500)"

Ich habe ein Postgres-Schema, das wie folgt aussieht:

enter image description here

Das Problem ist, dass ich immer den Fehler bekomme, wenn ich Text mit mehr als 500 Zeichen in der Beschreibungsspalte speichere:

value too long for type character varying(500)

In der Dokumentation für Postgres heißt es, dass Typentext unbegrenzt Zeichen enthalten kann.

Ich verwende Postgresql-9.1.

Diese Tabelle wurde mit Django 1.4 erstellt. Der Feldtyp im Modell ist TextField, falls dies das Problem weiter erläutert.

Irgendwelche Ideen, warum dies geschieht und was ich tun kann, um das Problem zu beheben?

29
Parham

Wenn Sie die Spalte als VARCHAR(500) angeben, haben Sie ein explizites Limit von 500 Zeichen festgelegt. Du hast das vielleicht nicht explizit gemacht, aber Django hat es irgendwo für dich gemacht. Ihnen zu sagen, wo es schwierig ist, wenn Sie Ihr Modell, den vollständigen Fehlertext oder die Abfrage, die den Fehler verursacht hat, nicht angezeigt haben.

Wenn Sie keine haben möchten, verwenden Sie eine nicht qualifizierte VARCHAR oder den TEXT-Typ.

varchar und text sind in der Länge nur durch die Systemgrenzen der Spaltengröße - etwa 1 GB - und durch Ihren Speicher begrenzt. Durch Hinzufügen eines Längenqualifizierers zu varchar wird jedoch ein kleinerer Grenzwert manuell festgelegt. Alle folgenden Angaben sind weitgehend gleichwertig:

column_name VARCHAR(500)

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

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

Die einzigen Unterschiede bestehen darin, wie Datenbank-Metadaten gemeldet werden und welche SQLSTATE-Werte bei Verstößen gegen die Einschränkung ausgelöst werden.

Die Längenbeschränkung wird im Allgemeinen nicht in vorbereiteten Anweisungsparametern, Funktionsaufrufen usw. befolgt, wie gezeigt:

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

und in expliziten Besetzungen führt dies zum Abschneiden:

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

ich denke, Sie verwenden sind eine VARCHAR(500)-Spalte, und Sie suchen nach der falschen Tabelle oder der falschen Instanz der Datenbank.

24
Craig Ringer

Unterschiedliche Zeichen unterscheiden sich von Text. Versuchen Sie zu laufen 

ALTER TABLE product_product ALTER COLUMN code TYPE text;

Dadurch wird der Spaltentyp in Text geändert, der sich auf sehr große Datenmengen beschränkt (Sie würden sie wahrscheinlich niemals treffen.)

6
Scott S

Wir hatten das gleiche Problem. Wir haben das Problem gelöst, indem der Entitätsattributdefinition eine Länge hinzugefügt wurde:

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