sql database django postgresql postgresql-9.1

Strange PostgreSQL "valor demasiado largo para caracteres de tipo variable(500)"



database django (3)

Tengo un esquema de Postgres que se parece a:

El problema es que cada vez que guardo un texto de más de 500 caracteres en la columna de descripción, aparece el error:

value too long for type character varying(500)

En la documentación de Postgres dice que el texto de tipo puede tener caracteres ilimitados.

Estoy usando postgresql-9.1.

Esta tabla se ha generado utilizando Django 1.4 y el tipo de campo en el modelo es TextField, si eso ayuda a explicar más el problema.

¿Alguna idea de por qué sucede esto y qué puedo hacer para solucionarlo?


Al especificar la columna como VARCHAR(500) , ha establecido un límite explícito de 500 caracteres. Es posible que no hayas hecho esto explícitamente, pero Django lo ha hecho por ti en algún lugar. Indicarle dónde es difícil cuando no ha mostrado su modelo, el texto completo del error o la consulta que produjo el error.

Si no desea uno, use un VARCHAR no calificado, o use el tipo TEXT .

varchar y el text tienen una longitud limitada solo por los límites del sistema en el tamaño de la columna (aproximadamente 1 GB) y por su memoria. Sin embargo, agregar un calificador de longitud a varchar establece un límite menor manualmente. Todos los siguientes son en gran medida equivalentes:

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

Las únicas diferencias están en cómo se reportan los metadatos de la base de datos y qué SQLSTATE se genera cuando se viola la restricción.

La restricción de longitud generalmente no se cumple en los parámetros de instrucciones preparadas, llamadas a funciones, etc., como se muestra:

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

y en los lanzamientos explícitos resulta en truncamiento:

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

así que creo que estás usando una VARCHAR(500) , y estás mirando la tabla incorrecta o la instancia incorrecta de la base de datos.


La variación de caracteres es diferente al texto. Intenta correr

ALTER TABLE product_product ALTER COLUMN code TYPE text;

Eso cambiará el tipo de columna a texto, que se limita a una gran cantidad de datos (probablemente nunca lo golpearías).


Tuvimos este mismo problema. Lo resolvimos agregando ''longitud'' a la definición del atributo de la entidad:

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