- MySQL
MySQL Data too long for columnの直し方|1406
ERROR 1406 (22001): Data too long for column 'name' at row 1 は、列に決めた長さより長い値を入れようとしたときのエラーです。 エラー文に、どの列か('name')と、何行目か(at row 1)が出ています。
直し方は2つです。
| 状況 | 直し方 |
|---|---|
| 入れる値が想定より長い(入力ミス・変換ミス) | 入れる側で長さを確かめる・そろえる |
| 列の長さが足りない(仕様が変わった・移行元が長い) | ALTER TABLE ... MODIFY で列を広げる |
確認環境:MySQL 8.0.46(文字コード utf8mb4、sql_mode は既定)(確認日 2026年10月11日)。VARCHAR(10)・CHAR(5)・TINYTEXT の列に、日本語・英字・絵文字を入れて再現しました。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL Data too long for columnの直し方|1406」
再現:VARCHAR(10) は「10文字」
CREATE TABLE member (
id int PRIMARY KEY,
name varchar(10),
code char(5),
bio tinytext
) DEFAULT CHARSET = utf8mb4;
| 入れた値 | 文字数 | バイト数 | 結果 |
|---|---|---|---|
あいうえおかきくけこ |
10 | 30 | 入る |
あいうえおかきくけこさ |
11 | 33 | ERROR 1406('name') |
🍣 × 10(絵文字) |
10 | 40 | 入る |
abcdefghijk |
11 | 11 | ERROR 1406 |
code に A00005(CHAR(5) に6文字) |
6 | 6 | ERROR 1406('code') |
VARCHAR(10)・CHAR(5) の数字は、バイト数ではなく文字数です(MySQL 公式マニュアル)。日本語でも絵文字でも、10文字までなら入り、英字でも11文字なら入りません。Oracle の VARCHAR2(10)(既定はバイト数)のように、バイト数で長さを決める DB から移行するときに、考え方の違いでずれが出ます。
TEXT 系はバイト数で数える
| 列 | 入れた値 | バイト数 | 結果 |
|---|---|---|---|
TINYTEXT |
あ × 85 |
255 | 入る |
TINYTEXT |
あ × 86 |
258 | ERROR 1406('bio') |
TINYTEXT |
a × 256 |
256 | ERROR 1406 |
TINYTEXT の上限は 255 バイトで、日本語(utf8mb4 で1文字3バイト)なら 85 文字まででした。TEXT 系の型は、文字数ではなくバイト数の上限で決まります。
| 型 | 上限 |
|---|---|
VARCHAR(n)・CHAR(n) |
n 文字 |
TINYTEXT |
255 バイト |
TEXT |
65,535 バイト |
MEDIUMTEXT |
約 16MB |
「at row N」の読み方
INSERT INTO member VALUES (11,'OK',...), (12,'OK',...), (13,'あいうえおかきくけこさしすせそ',...);
ERROR 1406 (22001): Data too long for column 'name' at row 3
at row 3 は、テーブルの3行目ではなく、その INSERT 文の中の3つ目の値です。複数の行をまとめて INSERT すると、何番目が長すぎたかが分かります。このとき、1つ目・2つ目の行も入りませんでした(文全体が取り消される)。CSV の取り込みなら、N 番目のデータ行を確かめます。
非 strict モードでは、黙って切り捨てられる
SET SESSION sql_mode = '';
INSERT INTO member VALUES (14, 'あいうえおかきくけこさしすせそ', 'A0014', NULL);
SHOW WARNINGS;
-- Warning 1265 Data truncated for column 'name' at row 1
SELECT name FROM member WHERE id = 14;
-- あいうえおかきくけこ ← 15文字が10文字に切られて保存された
sql_mode から strict モード(STRICT_TRANS_TABLES)を外していると、エラーにならず、後ろが切り捨てられて保存されます。 警告は出ますが、アプリからは気づきにくく、住所や名前の後半が消えたデータが残ります。MySQL 8.0 の既定は strict モードです。1406 を消すために strict モードを外さないようにします。
後ろの空白だけなら、警告で入る
INSERT INTO member VALUES (10, 'あいうえおかきくけこ ', ...); -- 10文字+空白2つ
Note 1265 Data truncated for column 'name' at row 1 ← エラーにならず、空白が切られた
長さを超えた部分が空白だけなら、strict モードでもエラーにならず、空白を切って保存されました(公式マニュアルでも、VARCHAR の超えた分の後ろの空白は、sql_mode に関係なく切られるとされています)。
長い値を探す
入っているデータから
SELECT id, CHAR_LENGTH(name) AS len FROM member ORDER BY len DESC LIMIT 10; -- 文字数
SELECT id, LENGTH(bio) AS bytes FROM member ORDER BY bytes DESC LIMIT 10; -- バイト数(TEXT 系)
CHAR_LENGTH は文字数、LENGTH はバイト数です。VARCHAR は CHAR_LENGTH、TEXT 系は LENGTH で比べます。
アプリの側で数えるとき(言語によって数え方が違う)
🍣 を10個並べた文字列の長さです。
| 言語 | 書き方 | 結果 |
|---|---|---|
| MySQL | CHAR_LENGTH() |
10 |
| Python | len(s) |
10 |
| JavaScript | s.length |
20 |
| JavaScript | [...s].length |
10 |
| Java | s.length() |
20 |
| Java | s.codePointCount(0, s.length()) |
10 |
Java の length() と JavaScript の length は、絵文字などを2と数えます。 画面の入力チェックで length() <= 10 としていると、絵文字入りの短い名前を「長すぎる」と弾いたり、MySQL と判定が食い違ったりします。MySQL の VARCHAR に合わせるなら、Java は codePointCount、JavaScript は [...s].length で数えます。
直し方:列を広げる
ALTER TABLE member MODIFY name varchar(50);
確認環境では、VARCHAR(50) にすると15文字の値が入りました。広げるときの注意です。
| 注意 | 内容 |
|---|---|
| インデックスの長さの上限 | utf8mb4 で VARCHAR(1000) にインデックスがあると、ERROR 1071 ... max key length is 3072 bytes になる(関連記事の「Incorrect string value」で再現) |
| 大きなテーブルの ALTER | 行数が多いと時間がかかる。本番は時間帯を選ぶ |
| アプリ側の長さのチェック | DB だけ広げても、画面やAPIの上限が10文字のままなら入力できない |
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | どの列か | エラー文の '列名' |
| 2 | 何番目の値か | at row N(INSERT 文の中の N 番目) |
| 3 | 列の型と長さ | SHOW CREATE TABLE。VARCHAR は文字数、TEXT 系はバイト数 |
| 4 | 値の長さ | CHAR_LENGTH(文字数)と LENGTH(バイト数) |
| 5 | 直す | 入れる値を見直す、または ALTER TABLE ... MODIFY |
| 6 | strict モード | 外さない。外れていたら、切り捨てられたデータがないか確認 |
よくある質問
Q. 全角は2文字、半角は1文字として数えますか。 A. 数えません。MySQL の VARCHAR は、全角・半角に関係なく1文字は1です。「全角10文字・半角20文字まで」のような仕様なら、アプリ側でバイト数(Shift_JIS 換算など)を数えて確かめます。
Q. LOAD DATA で CSV を取り込むと、エラーにならずに切られました。
A. LOAD DATA LOCAL は、strict モードでも、エラーを警告にして取り込みを続けます(公式マニュアル)。確認環境でも、VARCHAR(10) に13文字の値が Warning 1265 Data truncated だけで、10文字に切られて入りました。取り込んだあとに必ず SHOW WARNINGS を確かめます。
まとめ
- 列の長さより長い値を入れたエラー。エラー文に列名と行番号が出る
- VARCHAR(n)・CHAR(n) は n 文字。日本語でも絵文字でも同じ。TEXT 系はバイト数
at row Nは INSERT 文の中の N 番目。まとめた INSERT は全部取り消される- 非 strict モードでは黙って切り捨てられる。strict モードは外さない
- Java・JavaScript の length は絵文字を2と数える。MySQL に合わせるなら codePointCount・
[...s].length - 列を広げるなら
ALTER TABLE ... MODIFY。インデックスの上限とアプリ側の上限も確認
参考・出典
確認日はいずれも 2026年10月11日です。
- MySQL 8.0 Reference Manual「The CHAR and VARCHAR Types」:https://dev.mysql.com/doc/refman/8.0/en/char.html
- MySQL 8.0 Reference Manual「LOAD DATA Statement」:https://dev.mysql.com/doc/refman/8.0/en/load-data.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL Data too long for columnの直し方|1406」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。