- MySQL
MySQL ERROR 1118 Row size too largeの直し方
ERROR 1118 (42000): Row size too large は、1行に入る列の大きさの合計が、MySQL の上限を超えたときのエラーです。 メッセージは2種類あり、どちらの上限かで直し方が違います。
| メッセージ | 超えた上限 | 主な直し方 |
|---|---|---|
The maximum row size for the used table type, not counting BLOBs, is 65535. |
MySQL 全体の、1行の上限 65,535 バイト(長い VARCHAR を並べた) | 大きい VARCHAR を TEXT にする |
Row size too large (> 8126). |
InnoDB の、1ページに入る上限(16KB ページの半分弱) | 短い VARCHAR・CHAR がたくさんある列を TEXT にする、ROW_FORMAT を DYNAMIC にする、テーブルを分ける |
確認環境:MySQL 8.0.46、文字コード utf8mb4、innodb_page_size=16384、innodb_default_row_format=dynamic、innodb_strict_mode=ON(既定)で、2種類とも再現しました(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL ERROR 1118 Row size too largeの直し方」
65535 の上限:長い VARCHAR を並べたとき
CREATE TABLE a1 (c1 VARCHAR(10000), c2 VARCHAR(10000)) DEFAULT CHARSET=utf8mb4;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
VARCHAR の上限は「文字数」で書きますが、1行の上限 65,535 は「バイト数」で数えます。 utf8mb4 は1文字に最大4バイト使うので、次のように計算されます。
| 列 | 計算(最大のバイト数) | バイト数 |
|---|---|---|
| c1 VARCHAR(10000) utf8mb4 | 10,000 文字 × 4 バイト + 長さの記録 2 バイト | 40,002 |
| c2 VARCHAR(10000) utf8mb4 | 同上 | 40,002 |
| 合計 | 80,004 > 65,535 |
どこまでなら作れるか(確認環境)
| 列の定義 | 結果 |
|---|---|
VARCHAR(16383) utf8mb4 ×1 |
作れた(16,383 × 4 + 2 = 65,534) |
VARCHAR(16384) utf8mb4 ×1 |
ERROR 1074(列 1 つの上限 16383 を超えた) |
VARCHAR(65532) latin1(NULL 可) |
作れた |
VARCHAR(65533) NOT NULL latin1 |
作れた |
VARCHAR(65535) latin1 |
ERROR 1118 |
VARCHAR(21000) + VARCHAR(1000) utf8mb3 |
ERROR 1118(63,002 + 3,002 = 66,004) |
MySQL のマニュアルでも、65,535 バイトの上限には、長さの記録に使う 2 バイトなどが含まれると説明されています。
直し方:大きい列を TEXT にする
CREATE TABLE a8 (c1 TEXT, c2 TEXT) DEFAULT CHARSET=utf8mb4; -- 作れた
マニュアルによると、TEXT・BLOB の列は、1行の上限に 9〜12 バイトしか数えられません(中身は別の場所に保存されるため)。長い文章を入れる列は、VARCHAR を大きくするより TEXT にします。
| 型 | 入る大きさ(最大) | 向いている列 |
|---|---|---|
| VARCHAR(255) など | 指定した文字数 | 名前・メールアドレスなど、長さが決まる列 |
| TEXT | 65,535 バイト | 本文・備考 |
| MEDIUMTEXT | 16,777,215 バイト(約 16MB) | 長い本文・JSON の文字列 |
確認環境で、TEXT に 65,535 バイト、MEDIUMTEXT に 16,777,215 バイトの値は入り、1 バイト多いと ERROR 1406 になりました。
8126 の上限:短い列がたくさんあるとき
-- VARCHAR(60) を 70 列(utf8mb4)
CREATE TABLE b1 (c0 VARCHAR(60), c1 VARCHAR(60), ..., c69 VARCHAR(60))
DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
1列は小さくても、列が多いと InnoDB の上限(16KB ページの半分弱)を超えます。 VARCHAR(60) utf8mb4 は最大 240 バイトで、70 列なら 16,800 バイトです。マニュアルでは、InnoDB の1行の上限は「16KB ページなら 8KB 弱」と説明されています(8126 は、メッセージに表示された値です)。
InnoDB は、長い可変長の列を別のページに逃がして、上限に収めます。 ただし、確認環境では VARCHAR(1000) を 12 列(DYNAMIC)は作れたのに、VARCHAR(60) を 70 列は作れませんでした。短い列は別ページに逃がされにくく、行の中に残るためと読めます。
直し方
| 直し方 | 確認環境での結果 |
|---|---|
| 一部の列を TEXT にする | TEXT を 70 列(DYNAMIC)は作れた |
| ROW_FORMAT を DYNAMIC にする(COMPACT のとき) | VARCHAR(1000)×12 列:COMPACT はエラー、DYNAMIC は作れた |
| テーブルを分ける | 使う頻度の低い列を、別のテーブル(1対1)に移す |
ROW_FORMAT=COMPACT のときのメッセージ
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
メッセージの最後が BLOB prefix of 768 bytes(COMPACT・REDUNDANT)か 0 bytes(DYNAMIC)かで、今の ROW_FORMAT が分かります。 COMPACT では、長い列も先頭 768 バイトが行の中に残るので、上限に届きやすくなります。COMPACT を指定して作られたテーブルが残っていることがあるので、確かめます。
SELECT table_name, row_format FROM information_schema.tables WHERE table_schema = 'データベース名';
ALTER TABLE b2 ROW_FORMAT=DYNAMIC;
CREATE は通ったのに、INSERT で止まる形
innodb_strict_mode=OFF のときは、CREATE TABLE が警告だけで通り、長いデータを入れたときに初めてエラーになりました。
SET SESSION innodb_strict_mode=OFF;
CREATE TABLE b5 (...VARCHAR(60) を 70 列...) DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
-- Warning 139: Row size too large (> 8126). ...
| INSERT したデータ | 結果 |
|---|---|
各列に a を 60 文字(70 × 60 = 4,200 バイト) |
入った |
各列に あ を 30 文字(70 × 90 = 6,300 バイト) |
入った |
各列に あ を 60 文字(70 × 180 = 12,600 バイト) |
ERROR 1118 (> 8126) |
テストデータ(英数字・短い値)では動き、本番で日本語の長い値が入ったときに止まります。 CREATE TABLE で警告が出ていないか(SHOW WARNINGS)、strict mode が OFF になっていないかを確かめます。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | メッセージは 65535 か 8126 か | エラー文を読む |
| 2 | 65535 なら、VARCHAR の合計のバイト数 | 文字数 × 4(utf8mb4)+ 2 を合計 |
| 3 | 8126 なら、列の数と ROW_FORMAT | information_schema.tables |
| 4 | 長い文章の列は TEXT にできるか | ALTER TABLE ... MODIFY ... TEXT |
| 5 | 列が多すぎないか | 使う頻度の低い列を別テーブルに |
| 6 | strict mode が OFF ではないか | SELECT @@innodb_strict_mode |
よくある質問
Q. 1列に長すぎる値を入れたエラー(1406)とは違いますか。 A. 違います。1406 は1つの列の上限、1118 は1行の合計の上限です。1406 は関連記事の「MySQL Data too long for columnの直し方|1406」で扱っています。
Q. VARCHAR を TEXT に変えると、困ることはありますか。
A. TEXT の列に索引を作るときは、先頭の長さの指定が必要です。確認環境では CREATE INDEX i1 ON a8(c1) が ERROR 1170 になり、a8(c1(100)) なら作れました。型の選び方は、既存の記事「SQLデータ型一覧|MySQL・PostgreSQL比較とVARCHARとTEXT」で扱っています。
まとめ
- 65535 は MySQL 全体の1行の上限。長い VARCHAR → TEXT にする
- VARCHAR は文字数で書くが、上限はバイト数(utf8mb4 は 1文字 4 バイトで計算)
- 8126 は InnoDB の1ページの上限。短い列が多いとき → TEXT・テーブルを分ける
- メッセージの
BLOB prefix of 768 bytesは COMPACT。DYNAMIC にする - strict mode が OFF だと、INSERT で長いデータが来たときに初めて止まる
参考・出典
確認日はいずれも 2026年10月11日です。
- MySQL 8.0 Reference Manual「Limits on Table Column Count and Row Size」:https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL ERROR 1118 Row size too largeの直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。