报错信息
type:business,code:10408,
msg:execute sql error type operate, caused by type:business, code:1071, msg:Specified key was too
long; max key length is 767 bytes,
caused by Error 1071 (42000): Specified key was too long; max key length is 767 bytes
背景
现网发布前三个地域SQL脚本执行正常,第四个地域SQL执行报错,检查了这几个地域的数据库版本都一致都是5.7.36-txsql-log
建表语句
CREATE TABLE IF NOT EXISTS `table_A` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID,自增',
`appId` BIGINT NOT NULL COMMENT '应用ID,标识具体的业务应用',
`serialId` VARCHAR(255) NOT NULL COMMENT '序列号,用于区分不同的配置版本',
...
PRIMARY KEY(`id`),
UNIQUE `uk_app_serial`(`appId`, `serialId`) COMMENT '应用ID和序列号的联合唯一索引,防止重复配置',
INDEX `idx_app_serial_enable`(`appId`, `serialId`, `enable`) COMMENT '复合索引,优化appId、serialId和enable的联合查询',
) ENGINE = InnoDB DEFAULT CHARACTER SET = UTF8MB4 COMMENT = 'Redis倾斜率开关配置表';
原因
一般 MySQL 5.6 对于 InnoDB 存储引擎的索引长度限制为 767 字节。在我的表定义中,serialId 字段是一个 VARCHAR(255),在 UTF8MB4 字符集下,每个字符最多占用 4 个字节,因此 serialId 的最大长度为 1020 字节,这超过了索引的限制。
这里稍后得再确认一下现网各个数据库版本的差异
解决方案
1.缩短serialId的长度
2.更改字符集
个人感想
1.现网数据库各个地域的版本和配置还是应该保持一致,第一次遇见这种发布到一半,某个地域报错的情况
2.utf8mb4编码下的varchar字段长度需要慎用,尤其是需要建立索引的时候
1万+

被折叠的 条评论
为什么被折叠?



