78

私は次のようなPostgresスキーマを持っています:

ここに画像の説明を入力してください

問題は、説明列に500文字を超えるテキストを保存すると、次のエラーが発生することです。

value too long for type character varying(500)

Postgresのドキュメントでは、タイプテキストは無制限の文字を持つことができると書かれています。

私はpostgresql-9.1を使用しています。

このテーブルはDjango1.4を使用して生成されており、問題をさらに説明するのに役立つ場合は、モデルのフィールドタイプはTextFieldです。

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

4

4 に答える 4

45

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

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

varchar長さtextは、列サイズのシステム制限(約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

したがって、列を使用していて、データベースの間違ったテーブルまたは間違ったインスタンスを見ていると思います。VARCHAR(500)

于 2012-11-21T01:40:31.317 に答える
13

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

ALTER TABLE product_product ALTER COLUMN code TYPE text;

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

于 2012-11-21T01:33:24.083 に答える
5

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

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 
于 2018-02-20T11:46:18.393 に答える
0

私の問題は、テーブルにデータがあることでした。そのため、PostgreSQLではテーブルに変更を加えることができません。

より大きな値に変更してください!

于 2021-08-11T11:35:49.663 に答える