1. ホーム
  2. sql

PostgreSQLの「値が長すぎて文字が変化するタイプ(500)」がおかしい

2023-09-17 07:34:57

質問

私は以下のようなPostgresのスキーマを持っています。

問題は、説明欄に500文字以上のテキストを保存するたびに、エラーが発生することです。

value too long for type character varying(500)

Postgresのドキュメントでは、type textの文字数は無制限であると書かれています。

postgresql-9.1を使っています。

このテーブルは Django 1.4 を使って生成されており、モデル内のフィールドタイプは TextField です。

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

どのように解決するのですか?

カラムを指定することで 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

ということで を使用して VARCHAR(500) カラムを使用しており、間違ったテーブルまたはデータベースの間違ったインスタンスを見ています。