ฉันใช้เซิร์ฟเวอร์ 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
ฉันเคยเห็นผู้คนแก้ไขปัญหาด้วยการสลับรูปแบบแถวซึ่งฉันจะลองอีกเล็กน้อย แต่ฉันต้องการที่จะเข้าใจว่าอะไรเป็นสาเหตุของข้อผิดพลาดนี้
ขอบคุณล่วงหน้า!