[Err] 1071 - Specified key was too long; max key length is 767 bytes,【各版本mysql均已解决】

[Err] 1709 - Index column size too large. The maximum column size is 767 bytes.

错误信息如下所示:

[SQL]

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(512) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
[Err] 1709 - Index column size too large. The maximum column size is 767 bytes.

 

问题原因:

索引  “uk_role_permission” 的长度 4*255>767 ,

是由参数innodb_large_prefix 控制,

此参数控制索引前缀长度的,不开启最长的长度是 765byte,开启最长3072byte,一般出现此报错的数据库版本是小于MYSQL5.7,同时不同的版本开启的方式也略有不同。

一、在mysql5.6中的解决方法:

 1.1、set global innodb_large_prefix=on;

          或  set global innodb_large_prefix=1;

 show variables like "%innodb_large_prefix%"

1.2、set global innodb_file_format=Barracuda ;

   set global innodb_file_format_max=Barracuda ;

 

 修改后结果如下:

show variables like '%innodb_file_format%'

 1.3、已经创建的表修改 row_format 的格式:

alter table table_name1 row_format=dynamic;

1.4、或者在创建表时指定row_format:

错误案例一:

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(512) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
) row_format=dynamic;

 

错误案例二:

解决方法如下:

create table sys_dict_data
(
    id                   bigint NOT NULL COMMENT 'id',
    dict_type_id         bigint NOT NULL COMMENT '字典类型ID',
    dict_label           varchar(255) NOT NULL COMMENT '字典标签',
    dict_value           varchar(255) COMMENT '字典值',
    remark               varchar(255) COMMENT '备注',
    sort                 int unsigned COMMENT '排序',
    creator              bigint COMMENT '创建者',
    create_date          datetime COMMENT '创建时间',
    updater              bigint COMMENT '更新者',
    update_date          datetime COMMENT '更新时间',
    primary key (id),
    unique key uk_dict_type_value (dict_type_id, dict_value),
    key idx_sort (sort)
)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='字典数据' row_format=dynamic;

 

二、在mysql5.7中不存在该问题,默认格式正常,只要字段长度符合即可。

innodb_large_prefix=1         (默认值 1)

innodb_default_row_format=dynamic         (默认是dynamic) 

innodb_file_format=Barracuda          (默认值 Barracuda)

需要调整的参数的默认值是符合要求

 三、在mysql8.0版本中, 此参数已废弃,默认的行格式最长3072 byte。

总结:

        一般在MySQL 5.7及以上版本不会遇到此问题,只有在MySQL 5.6版本会遇到此问题,建议MySQL 5.6 升级到MySQL 5.7,因为MySQL 5.6 修改比较麻烦。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[Err] 1071 - Specified key was too long; max key length is 767 bytes 是一个错误信息,表明创建索引时指定的键太长,超过了最大长度限制为767字节。这个错误通常与MySQL数据库的限制有关。MySQL的innodb存储引擎对于单个列的长度限制为767字节,对于多列索引的长度限制为3072字节。这意味着每个列的长度不能大于767字节,而组成索引的所有列的长度总和不能超过3072字节。因此,如果在创建索引时指定的键长度超过了这些限制,就会出现这个错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [建表语句错误:[Err] 1071 - Specified key was too long; max key length is 767 bytes](https://blog.csdn.net/u010931123/article/details/102801269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [1071 - Specified key was too longmax key length is 767 bytes](https://blog.csdn.net/qq_38925911/article/details/118210392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值