Strange PostgreSQL " valor demasiado largo para la variación de caracteres de tipo (500)"


Tengo un esquema Postgres que se parece a:

introduzca la descripción de la imagen aquí

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

value too long for type character varying(500)

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

Estoy usando postgresql-9.1.

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

Cualquier idea ¿por qué está pasando esto y qué puedo hacer para arreglarlo?

Author: Parham, 2012-11-21

3 answers

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. Decirle dónde es difícil cuando no ha mostrado su modelo, el texto de error completo o la consulta que produjo el error.

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

varchar y text están limitados en longitud solo por los límites del sistema en el tamaño de la columna-alrededor de 1 GB - y por tu memoria. Sin embargo, agregar un calificador de longitud a varchar establece un límite más pequeño 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 obedece en 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 moldes explícitos resulta en truncamiento:

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

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

 22
Author: Craig Ringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-21 01:56:05

La variación de caracteres es diferente al texto. Prueba a ejecutar

ALTER TABLE product_product ALTER COLUMN code TYPE text;

Eso cambiará el tipo de columna a texto, que está limitado a una gran cantidad de datos (probablemente nunca lo alcanzaría.)

 6
Author: Scott S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-21 01:33:24

Tuvimos este mismo problema. Lo resolvimos añadiendo 'length' a la definición de atributo de entidad:

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 
 1
Author: Marco Lucio Lorenzotti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-20 11:46:18