Korzystam z serwera MySQL na moim Macbooku (do testowania). Wersja jest 5.6.20 od Homebrew. Zacząłem napotykać błędy „Zbyt duży rozmiar wiersza” i udało mi się zredukować to do tego przypadku testowego. Stół:
mysql> describe test;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| stuff | longtext | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
Status tabeli:
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 | | |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
Występuje błąd, gdy próbuję wstawić wiersz do tabeli, w której stuff
kolumna ma więcej niż 5033932 bajtów.
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.
Szukałem tego błędu, większość odpowiedzi wymaga posiadania zbyt wielu kolumn TEKSTOWYCH, a każda z nich ma wbudowane 768 bajtów. Jak widać, w moim przypadku tak nie jest. Ponadto liczba 5033932 pozostaje taka sama, niezależnie od liczby kolumn, które mam w tabeli. W mojej oryginalnej aplikacji było pięć kolumn, a aktualizacje nadal nie powiodły się, gdy rozmiar kolumny przekroczył 5033932.
Widziałem też, jak ludzie rozwiązują ten problem, zmieniając formaty wierszy, które spróbuję za chwilę, ale chciałbym dokładnie zrozumieć, co powoduje ten błąd.
Z góry dziękuję!