Я использую сервер 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.
Я также видел, как люди решали проблему, переключая форматы строк, что я попробую чуть позже, но я хотел бы точно понять, что является причиной этой ошибки.
Заранее спасибо!