MySQL 添加列报错处理

梦莱2年前技术文章920

一、添加列报错(65535)

表添加列收到报错,具体 SQL 和报错信息如下:

ALTER TABLE table ADD column varchar(256) NULL COMMENT '个人打款授权书';

报错信息:Error 1118: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

核实为 mysql 表有一个限制是 row size 不能超过 65535。查看表结构发现,表中有两个列都为 varchar (10000)。

L1VzZXJzL2VkeS9MaWJyYXJ5L0NvbnRhaW5lcnMvNVpTTDJDSlUyVC5jb20uZGluZ3RhbGsubWFjL0RhdGEvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L0RpbmdUYWxrTWFjLzEyNzUwODg3NjZfdjIvSW1hZ2VGaWxlcy8xNjg4Njk5NzQ3NDkxXzA0MEJCMkRCLTJDNDItNEFBRC04Mzk4LTUxRDAxQ0VEMzIwNS5wbmc=.png

MYSQL数据库中规定一条记录的最大长度是65535字节,定义到这个长度也会报错,行本身维护也会占用字节。不管任何存储引擎,都不能超过这个范围,即使存储引擎支持一行存储更长的数据。该限制为mysql server 层限制

建议:可以考虑下这两个字段的用途以及实际存储空间需要,如果存储较大数据的话,建议改为text或者blob。然后再去添加 personal_certificate varchar(256) 字段。text、blob会使用 溢出页 的方式存储,相对于 varchar(10000) 会释放一些 row size出来

二、添加列报错(8126)

添加 char 列报错情况,具体报错如下:

 ALTER TABLE partner_formal ADD personal_certificate char(256) NULL COMMENT '个人打款授权书';

Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline

该限制为 innodb 引擎层限制,因为innodb 限制一条记录最多使用半个页面(即一个页面最少要记录两条数据),而默认情况下,Innodb页面大小是16KB,因此一条记录最大不能超过8126 字节。(如果一个页面的数据量不能存储2条记录,则这个B+树就不能称为B+树,因为它起不到一个索引的作用,其实就是一个双向链表,但比双向链表占用的空间大很多。如果不能够存储2条记录,那么这个B+树是没有意义的,形不成一个有效的索引)

如果使用 varchar(),在创建列的时候不报错,但是后续插入数据,如果达到 8126字节,还是会报错导致数据无法插入;因为 char 是定长,相当于已经分配好的字节,而 varchar 是变长,但后续数据插入达到限制会导致数据插入不进去。


相关文章

shell脚本-expect

shell脚本-expect

一、概述       Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。       在一些需要交互输入指令的场景下,...

MySQL 闪回技术总结

MySQL 闪回技术总结

一、闪回技术汇总1. 第一类为以 patch 形式集成到官方工具 mysqlbinlog 中,阿里彭立勋 2012 年曾提交过相关工具;2. 第二类是独立工具,通过伪装 Slave 拉取 Binlog...

kafka高可靠性相关配置

kafka高可靠性相关配置

为保证高可靠可以通过以下方面进行设置:1) 物理机器场景配置项配置说明高可靠高性能不间断电源配置,防止服务器异常断电RAID卡电池配置,防止服务器异常断电RAID卡写缓存开启,提高性能RAID 1配置...

Yarn调度器对比

1)Hadoop调度器重要分为三类:FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。Apache默认的资源调度器是容量调度器;CDH...

爬坑记录------容器内外网络不通,端口无法访问

爬坑记录------容器内外网络不通,端口无法访问

背景:客户需要一套datahub用于分许sparksql血缘,因此需要基于docker搭建,在搭建过程中遇到一个较坑的问题,这里做以记录搭建完成后查看docker容器已经正常启动查看红框中的内容信息,...

HBase 的 BulkLoad 机制

HBase 的 BulkLoad 机制

1.概述在实际生产环境中,有这样一种场景:用户数据位于HDFS中,业务需要定期将这部分海量数据导入 HBase 系统,以执行随机查询更新操作。这种场景如果调用写入 API 进行处理,极有可能会给 Re...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。