
# 索引长度限制导致修改varchar长度失败
#### 场景描述
执行alter table修改表结构失败，报错如下：
```
Specified key was too long; max key length is 3072 bytes
```
![](https://support.huaweicloud.com/trouble-taurusdb/figure/zh-cn_image_0000001882571212.png)
#### 原因分析
- 在"innodb_large_prefix"设置为off的情况下，InnoDB表的单字段索引的最大字段长度不能超过767字节，联合索引的每个字段的长度不能超过767字节，且所有字段长度合计不能超过3072字节。
- 当"innodb_large_prefix"设置为on时，单字段索引最大长度可为3072字节，联合索引合计最大长度可为3072字节。
- 索引长度与字符集相关。使用utf8字符集时，一个字符占用三个字节，在"innodb_large_prefix"参数设置为on情况下，索引的所有字段的长度合计最大为1072个字符。
查看表结构如下：
```
CREATE TABLE `xxxxx` (
……
`subscription_type` varchar(64) NOT NULL DEFAULT 'DEVICE_EXCEPTION' COMMENT '订阅类型',
`auth_key` varchar(255) DEFAULT '' COMMENT '签名，接口请求头会根据这个值增加token',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `enterprise_id` (`subscription_type`,`enterprise_id`,`callback_url`) USING BTREE)
) ENGINE=InnoDB AUTO_INCREMENT=1039 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
```
该表使用了utf8字符集，一个字符占用三个字节。联合索引"enterprise_id"包含了"callback_url"字段，如果执行DDL操作将"callback_url"修改为varchar(1024)，会超出联合索引最大长度限制，所以报错。
#### 解决方案
MySQL机制约束，建议修改索引或字段长度。
