MacbookでMySQLサーバーを実行しています(テスト用)。バージョンはHomebrewの5.6.20です。「行サイズが大きすぎます」というエラーが発生し始めましたが、このテストケースまで減らすことができました。テーブル:
mysql> describe test;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| stuff | longtext | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
テーブルのステータス:
mysql> show table status where Name = 'test';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| test | InnoDB | 10 | Compact | 1 | 16384 | 16384 | 0 | 0 | 5242880 | 2 | 2014-08-28 23:51:12 | NULL | NULL | utf8_general_ci | NULL | | |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
列にstuff
5033932バイトを超える行をテーブルに挿入しようとすると、エラーが発生します。
mysql> select length(stuff) from test;
+---------------+
| length(stuff) |
+---------------+
| 5033932 |
+---------------+
mysql> update test set stuff = concat(stuff, 'a');
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.
私はこのエラーを探してみましたが、ほとんどの回答にはTEXT列が多すぎることが含まれており、それぞれに768バイトがインラインで格納されています。ご覧のとおり、それは私には当てはまりません。また、5033932の数は、テーブルにある列の数に関係なく同じままです。元のアプリケーションでは5つの列があり、列サイズが5033932を超えても更新は失敗しました。
行の形式を切り替えることで問題を解決する人もいるので、少し試してみますが、このエラーの原因を正確に理解したいと思います。
前もって感謝します!