web-dev-qa-db-ja.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です。それが問題の詳細な説明に役立つ場合).

なぜこれが起こっているのか、それを修正するために何ができるのかというアイデアはありますか?

35
Parham

列をVARCHAR(500)として指定することにより、明示的な500文字の制限を設定しました。自分でこれを明示的に行っていないかもしれませんが、Djangoはあなたのためにどこかでそれを行っています。モデル、完全なエラーテキスト、またはエラーが発生しました。

不要な場合は、修飾されていないVARCHARを使用するか、TEXTタイプを使用します。

varchartextの長さは、システムの列サイズの制限(約1GB)とメモリによってのみ制限されます。ただし、長さ修飾子を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
_

だから、あなたはareVARCHAR(500)カラムを使用していて、間違ったテーブルまたは間違ったデータベースのインスタンスを見ていると思います。

29
Craig Ringer

可変文字はテキストとは異なります。実行してみてください

ALTER TABLE product_product ALTER COLUMN code TYPE text;

これにより、列タイプがテキストに変更されます。テキストは、非常に大量のデータに制限されます(おそらく実際にヒットすることはないでしょう)。

6
Scott S

同じ問題がありました。エンティティ属性定義に「長さ」を追加して解決しました:

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