报错日志:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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.
问题原因:
1、在mysql innodb存储引擎中,数据是以页为单位进行存储的,每个页默认大小为16KB(由innodb_page_size配置选项定义),innodb又规定每页至少需要存储两行数据,所以innodb行最大存储略小于8KB的数据(除去页头页尾等占用的大小)。
2、如果包含可变长度列(varchar等)的行超过innodb行最大存储大小,innodb将选择可变长度列进行外部页存储,直到该行符合innodb行大小限制。
3、在mysql 5.6版本中支持的行格式有:REDUNDANT和COMPACT,在这两种行格式中,将变长列值(varchar、varbinary、blob和文本类型)的前768个字节存储在innodb页中,这样当表中的可变长列的个数超过一定数量后,单行大小就可能会超过8KB,就会发生行溢出现象。
而在mysql 5.7版本中,新增加两个行格式:DYNAMIC和COMPRESSED,在这两种行格式中,将变长列值(varchar、varbinary、blob和文本类型)完全存储在溢出页,innodb页中只包含指向溢出页的20字节指针。
所以当表中的可变长列的个数相等的情况下,由于底层行格式机制的不同,在mysql 5.7版本中就不会发生行溢出,但在mysql 5.6版本中就可能会出现行溢出。