PostgreSQLの「値が長すぎて文字が変化するタイプ(500)」がおかしい
質問
私は以下のような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
という型を使用します。
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)
カラムを使用しており、間違ったテーブルまたはデータベースの間違ったインスタンスを見ています。
関連
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] NOT IN vs NOT EXISTS
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
解決策:java.sql.SQLException: ユーザー ''@'localhost'' (パスワード: YES を使用) のアクセスが拒否されました。
-
MHAクラスタエラーサマリーの構築
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?