Подтвердить что ты не робот

Strange PostgreSQL "слишком долго для символа типа (500)"

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

enter image description here

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

value too long for type character varying(500)

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

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

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

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

4b9b3361

Ответ 1

Задав столбец как 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), и вы смотрите на неправильную таблицу или неверный экземпляр базы данных.

Ответ 2

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

ALTER TABLE product_product ALTER COLUMN code TYPE text;

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