it-roy-ru.com

Странный PostgreSQL "значение слишком длинное для типа символа, варьирующегося (500)"

У меня есть схема Postgres, которая выглядит следующим образом:

enter image description here

Проблема в том, что всякий раз, когда я сохраняю текст длиной более 500 символов в столбце описания, я получаю сообщение об ошибке:

value too long for type character varying(500)

В документации для Postgres говорится, что тип текста может иметь неограниченное количество символов.

Я использую postgresql-9.1.

Эта таблица была сгенерирована с использованием Django 1.4, а тип поля в модели - TextField, если это поможет объяснить проблему дальше.

Есть идеи, почему это происходит и что я могу сделать, чтобы это исправить?

29
Parham

Определяя столбец как VARCHAR(500), вы устанавливаете явное ограничение в 500 символов. Возможно, вы не сделали этого сами, но Django где-то сделал это для вас. Сообщать вам, где сложно, когда вы не показали свою модель, полный текст ошибки или запрос, который вызвал ошибку.

Если он вам не нужен, используйте неквалифицированную VARCHAR или тип TEXT.

Длина varchar и text ограничена только системными ограничениями на размер столбца (около 1 ГБ) и вашей памятью. Однако добавление квалификатора длины в varchar устанавливает меньший предел вручную. Все следующее в значительной степени эквивалентно:

column_name VARCHAR(500)

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

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

Единственные различия заключаются в том, как сообщается метаданные базы данных и какой SQLSTATE вызывается при нарушении ограничения.

Ограничение длины обычно не соблюдается в подготовленных параметрах операторов, вызовах функций и т.д., Как показано:

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

и в явном приведении это приводит к усечению:

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

поэтому я думаю, что вы используете используете столбец VARCHAR(500), и вы просматриваете не ту таблицу или неправильный экземпляр базы данных.

24
Craig Ringer

Изменение символов отличается от текста. Попробуйте запустить 

ALTER TABLE product_product ALTER COLUMN code TYPE text;

Это изменит тип столбца на текстовый, который ограничен каким-то очень большим объемом данных (вы, вероятно, никогда не попадете в него).

6
Scott S

У нас была такая же проблема. Мы решили это, добавив 'length' к определению атрибута объекта:

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 
1
Marco Lucio Lorenzotti