- データベース
PostgreSQL value too longの直し方|varchar
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期連続の黒字決算。