ERROR: value too long for type character varying(10) は、varchar(10) の列に、10文字を超える文字列を入れようとしたときのエラーです。 困るのは、エラー文に「どの列か」が出ないことです。(10) の長さから、列の候補を絞り込みます。

直し方 書き方
どの列かを探す 下の「長すぎる列を探す SQL」、COPY ならエラー文に列名が出る
列を広げる(データが正しい) ALTER TABLE ... ALTER COLUMN 列 TYPE varchar(50);(すぐ終わる)
データを直す(入力の間違い) 入れる前に長さを確かめる

確認環境:PostgreSQL 16.15、psycopg 3.3.6(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「PostgreSQL value too longの直し方|varchar」

再現:どの列か分からない

CREATE TABLE v89 (id int, code varchar(5), name varchar(10), pref varchar(4), tel varchar(13), memo char(3));
INSERT INTO v89 (id, code, name, pref, tel) SELECT id, code, name, pref, tel FROM v89s;   -- 取り込み用の表から
ERROR:  value too long for type character varying(10)

詳しい表示(\set VERBOSITY verbose)にしても、ERROR: 22001: value too long ... と SQLSTATE が付くだけで、列名は出ませんでした。 Python(psycopg)でも、例外の diag.column_name は None でした。

手がかり1:(10) の長さの列を探す

SELECT column_name, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'v89' AND character_maximum_length IS NOT NULL;
code   5
name  10      ← (10) はこの列
pref   4
tel   13
memo   3

同じ長さの列が1つなら、それが原因です。varchar(50) が何列もある場合は、次の SQL で探します。

手がかり2:長すぎる行と列を探す SQL

SELECT s.id,
  CASE WHEN length(s.code) > 5  THEN 'code('  || length(s.code)  || ')' END AS code_ng,
  CASE WHEN length(s.name) > 10 THEN 'name('  || length(s.name)  || ')' END AS name_ng,
  CASE WHEN length(s.pref) > 4  THEN 'pref('  || length(s.pref)  || ')' END AS pref_ng
FROM v89s s
WHERE length(s.code) > 5 OR length(s.name) > 10 OR length(s.pref) > 4;
 id | code_ng | name_ng  | pref_ng
----+---------+----------+---------
 11 |         | name(11) |
 12 | code(6) |          |

行と列、何文字あるかが一度に分かりました。 取り込むデータを、いったん長さの制限が無い text の列の表に入れてから、この SQL で確かめると、エラーで止まる前に全部の問題を洗い出せます。

手がかり3:COPY なら列名が出る

=> \copy v89 (id, code, name, pref) FROM 'data.csv' WITH (FORMAT csv)
ERROR:  value too long for type character varying(5)
CONTEXT:  COPY v89, line 3, column code: "A00220"

COPY では、CONTEXT に何行目・どの列・どの値かが表示されました。 CSV の取り込みなら、この表示で直す場所が分かります。

varchar(n) は文字数(バイト数ではない)

入れた値 varchar の長さ 結果
「あいうえおかきくけこ」(10文字) varchar(10) 入った
「あいうえおかきくけこさ」(11文字) varchar(10) エラー
🍣 × 5(20 バイト) varchar(5) 入った(length は 5、octet_length は 20)

PostgreSQL の varchar(n) は文字数で数えます(公式ドキュメント)。日本語や絵文字でも、1文字は1文字です。MySQL の場合と比べたいときは、関連記事の「MySQL Data too long for columnの直し方|1406」を見てください。

エラーにならず、切り捨てられる場合

書き方 結果(確認環境)
INSERT ... VALUES ('あいうえおかきくけこさ') エラー
'あいうえおかきくけこさ'::varchar(10) エラーにならず、10文字に切り捨て(「さ」が消えた)
'abc '(後ろに空白5つ)を varchar(5) に エラーにならず、'abc ' に切り詰め(超えた分が空白だけのとき)
char(3) に 'abcd' エラー(character(3))

明示的に ::varchar(10) とキャストすると、エラーにならずに切り捨てられました(公式ドキュメントでも、明示的なキャストでは切り捨てるとされています)。エラーを消すためにキャストを書くと、データが黙って欠けます。超えた分が空白だけなら、エラーにせず切り詰めるのも仕様です。

列を広げる:ALTER はすぐ終わる

ALTER TABLE v89 ALTER COLUMN code TYPE varchar(10);
ALTER TABLE v89 ALTER COLUMN code TYPE text;
変更 テーブルの作り直し(確認環境)
varchar(5) → varchar(10)(広げる) なし(pg_relation_filenode が変わらなかった)
varchar → text なし
varchar(10) → varchar(2)(狭める) 長いデータがあると value too long for type character varying(2)

広げる変更や text への変更は、テーブルを作り直さずに終わりました。 大きなテーブルでも、ほとんど時間がかかりません(integer を bigint に変えるときは作り直しが起きました。関連記事の「PostgreSQL integer out of rangeの原因と直し方」で扱っています)。

公式ドキュメントでは、char・varchar・text の性能の差はほとんど無く、多くの場合 text か varchar を使うよう書かれています。 長さの制限が業務の決まり(郵便番号は7桁など)でないなら、text にして、長さの確認はアプリや CHECK 制約で行う方法もあります。

確認の手順(チェックリスト)

順番 確認すること 方法
1 長さ(n) エラー文の character varying(10)
2 その長さの列 information_schema.columns
3 長すぎる行 length(列) > n で探す
4 COPY なら CONTEXT の line・column
5 直す方 列を広げる(すぐ終わる)か、データを直す
6 キャストを書いていないか ::varchar(n) は黙って切り捨てる

よくある質問

Q. SQLSTATE は何ですか。 A. 22001(string_data_right_truncation)です。psycopg では StringDataRightTruncation の例外になりました。

まとめ

  • varchar(n) の n 文字を超えたエラー。エラー文にどの列か出ない
  • information_schema.columns で長さの列を、length(列) > n で行を探す
  • COPY なら CONTEXT に行と列が出る
  • n は文字数。日本語・絵文字も1文字
  • ::varchar(n) のキャストは、黙って切り捨てる
  • 列を広げる ALTER はテーブルを作り直さず、すぐ終わる

参考・出典

確認日はいずれも 2026年10月11日です。

  • PostgreSQL 16 Documentation「Character Types」:https://www.postgresql.org/docs/16/datatype-character.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「PostgreSQL value too longの直し方|varchar」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?