Странный PostgreSQL «значение слишком длинное для символов разного типа (500)»

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

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

value too long for type character varying(500)

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

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

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

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

 Parham21 нояб. 2012 г., 02:42
Я только что проверил psql вставку через командную строку, ошибка нетам не бывает. Это может быть проблема с кодировкой.
 Robert H21 нояб. 2012 г., 02:36
Проблема возникает со вставками PSQL или только из Django?
 Parham21 нояб. 2012 г., 03:08
Спасибо за ваш ответ, познакомил меня с очень удобным знанием для отслеживания ошибок.
 Parham21 нояб. 2012 г., 02:59
Я только что проверил файл журнала, когда при сохранении соответствующего поля произошла ошибка, которая не быласоблюдение ограничения в 500 символов
 Craig Ringer21 нояб. 2012 г., 02:52
Нет, это не проблема кодирования. Пожалуйста, покажите фактический оператор INSERT, сгенерированный Django, и полный, точный текст сообщения об ошибке. Вы можете получить оба из файлов журнала PostgreSQL.
 Craig Ringer21 нояб. 2012 г., 02:41
Так как тыВы сгенерировали таблицу из модели Django, как насчет показа кода модели Django?
 Craig Ringer21 нояб. 2012 г., 03:01
Рад слышать, что у вас есть решение. Теперь вы знаете еще одну вещь, которую нужно проверить, и еще одну вещь, которую нужно включить в будущие вопросы :-)
 Scott S21 нояб. 2012 г., 02:48
Возможно ли, что этот столбец был изменяющимся символом (500), но был изменен на текст, но изменение нене было совершено, и поэтому клиент Django не можетне видите изменения? Это кажется маловероятным, но ошибка от django определенно указывает на то, что для него столбец - char var, в то время как мы ясно видим из этого вывода, что это текст.

Ответы на вопрос(3)

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

ALTER TABLE product_product ALTER COLUMN code TYPE text;

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

 Parham21 нояб. 2012 г., 02:35
Я отредактировал вопрос, проблема с полем описания, которое уже набирает текст
Решение Вопроса

VARCHAR(500) вы'Мы установили явное ограничение в 500 символов. Возможно, вы сами этого не сделали, но Django где-то сделал это для вас. Говорить тебе, где тяжело, когда у тебя нетt показывает вашу модель, полный текст ошибки или запрос, вызвавший ошибку.

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

 Parham21 нояб. 2012 г., 02:57
Я только что проверил файлы журналов, так как вы предположили, что это происходит при сохранении другого связанного поля
 Parham21 нояб. 2012 г., 02:43
м, используя тип текста, посмотрите на столбец описания
 Craig Ringer21 нояб. 2012 г., 02:50
@Parham Я вижу это. Объяснение остается актуальным;varchar(500) где-то используется. Пожалуйста, покажите фактический запрос в вашем вопросе, чтобы мы могли видеть запрос, который 'Сбой. Если ты можешь'Получите его от Django, получите его из файлов журнала PostgreSQL и отредактируйте ваш вопрос, чтобы добавить запрос к вопросу. Вам может понадобиться установитьlog_statement = 'all' вpostgresql.conf и перезагрузите PostgreSQL, если полный текст запроса неt вошел вместе с ошибкой.

ю атрибута объекта:

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

Ваш ответ на вопрос