【mysql踩坑】utf8mb4编码下varchar(255)导致的超限报错

报错信息

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字段长度需要慎用,尤其是需要建立索引的时候

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shaohjz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值