最新在更新项目的时候,需要对一些数据表增加几个新的字段。前面增加两个的时候还很正常没有出现异常情况,在增加的时候就开始报错了,报错的内容是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.翻译翻译的意思就是:行大小太大(>8126)。将某些列更改为TEXT或BLOB,或使用ROW_FORMAT=DYNAMIC或ROW_FORMAT=COMPRESSED可能会有所帮助。在当前的行格式中,768字节的BLOB前缀是内联存储的。
普通翻译一下就是,单行数据的长度太长了,不允许在增加字段了,你可以把之前的字段类型改称text或者blob的格式来缩减长度然后在增加字段,但是这个解决方式有点不彻底,加的多的话还是解决不了。
这里直接就把彻底解决的方式解释一下,如果你的表使用的是REDUNDAN或者COMPACT的行格式,那么我们只需要把行格式改称DYNAMIC就可以了。
数据库的行格式根据不同的数据库系统可能有所不同。以下是MySQL中的四种行格式:
REDUNDANT(冗余行格式):
这是MySQL 5.0之前默认的行格式。
特点包括将前768字节的变长列值存储在B树节点的索引记录中,多余的部分存储在溢出页。
对于大于768字节的固定长度列,会被编码为可变长度列并可能存储在页面外。
这种格式在MySQL 5.0及之后的版本中逐渐被新的行格式所取代,但在某些系统表中可能仍然使用。
COMPACT(紧凑行格式):
MySQL 5.0及更高版本默认的行格式(在某些MySQL版本中,如MySQL 5.7,默认行格式可能已更改为DYNAMIC)。
与REDUNDANT相比,COMPACT行格式减少了存储空间的使用,并可能提高性能,尤其是在缓存命中率和磁盘速度有限制的情况下。
它也使用溢出页来存储超过768字节的列值,但整体存储结构更加紧凑。
DYNAMIC(动态行格式):
MySQL 5.7及更高版本的默认行格式(在启用了Barracuda文件格式的InnoDB存储引擎中)。
这种行格式支持更长的可变长度列和更大的索引键前缀,能够更好地处理大型数据集和复杂查询。
它将长列值完全存储在溢出页中,并在记录头中仅存储指向这些溢出页的指针,从而减少了记录头的大小并提高了存储效率。
COMPRESSED(压缩行格式):
类似于DYNAMIC行格式,但增加了对表和索引数据的压缩支持。
通过压缩数据,可以进一步减少存储空间的使用,但可能会增加CPU的使用率,因为数据在读取和写入时需要进行压缩和解压。
要使用COMPRESSED行格式,需要启用innodb_file_per_table选项,并确保InnoDB存储引擎使用的是Barracuda文件格式。