Я запускаю сервер MySQL на своєму Macbook (для тестування). Версія 5.6.20 від Homebrew. Я почав стикатися з помилками "Розмір рядка занадто великий", і мені вдалося зменшити його до цього тестового випадку. Таблиця:
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 залишається таким же, незалежно від кількості стовпців у таблиці. У моїй оригінальній програмі було п'ять стовпців, і оновлення все ще не вдалося, коли розмір стовпця перевищив 5033932.
Я також бачив, як люди вирішують проблему, змінюючи формати рядків, які я спробую трохи, але хотілося б зрозуміти, що саме спричиняє цю помилку.
Спасибі заздалегідь!