MySQL5.6建索引时遇到 Specified key was too long; max key length is 767 bytes错误提示解决办法

一、错误提示

Specified key was too long; max key length is 767 bytes;

二、原因分析

在数据库中,索引的字段设置太长了,导致不支持。【根本原因:5.6版本的innodb大长度前缀默认是关闭的】。

mysql建立索引时,数据库计算key的长度是累加所有index用到的字段的char长度,在按照下面的比例乘起来

不能超过限定的key长度767:

latin1 = 1 byte = 1 character

uft8 = 3 byte = 1 character

utf8mb4 = 4byte = 1character

gbk = 2 byte = 1 character

做个实验:

CREATE TABLE `xxl_job_registry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `registry_group` varchar(50) NOT NULL,
  `registry_key` varchar(190) NOT NULL,
  `registry_value` varchar(250) NOT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `i_g_k_v` (`registry_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
 
registry_key 190 * 4 = 760因此创建成功
 
若将registry_key的字节数改成192,则195 * 4 = 780 则创建不成功

注意

网上说,如果是联合索引的话,应该是两个索引的字节加起来,然后折算成字节数。例如:

CREATE TABLE `xxl_job_registry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `registry_group` varchar(50) NOT NULL,
  `registry_key` varchar(190) NOT NULL,
  `registry_value` varchar(110) NOT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `i_g_k_v` (`registry_key`, `registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
那么索引需要的字节数是:(190 + 110) * 4 = 1200
创建不成功
 
 
但是实际上呢,是能创建成功。
在创建索引的时候进行了优化,取字节数最长的那个 190 * 4 = 760因此能创建成功。

 三、解决方法

1、第一种解决方法

修改索引的varchar字符,只要让字符 * 字节数 < 767即可,所以网上推荐 缩小字符数

但是有时某个字段的字符数是一定要足够大的,这时候用第二种方式。

2、第二种解决方法

// 查看
 
show variables like "innodb_large_prefix";
 
show variables like "innodb_file_format";
 
//修改最大索引长度限制
set global innodb_large_prefix=1;
或
set global innodb_large_prefix=on;
 
set global innodb_file_format=BARRACUDA;

 

修改插入sql的语句添加ROW_FORMAT=DYNAMIC;

create table idx_length_test_02
(
  id int auto_increment primary key,
  name varchar(255)
)ROW_FORMAT=DYNAMIC ENGINE=InnoDB default charset utf8mb4;

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 。 引用:【[Err] 1071 - Specified key was too longmax key length is 767 bytes,【各版本mysql均已解决】】http://t.csdn.*** was too longmax key length is 767 bytes 二、分析: 。 问题:请告诉我,sql错误1071Specified key was too long; max key length is 767 bytes SQL错误1071 "Specified key was too long; max key length is 767 bytes" 是由于在MySQL数据库中创或修改表,指定的键的长度超过了最大限制引起的错误。最大键长度限制在767字节。这个问题可以在各个版本的MySQL中解决。 为了解决这个问题,你可以采取以下几种方法之一: 1. 缩短键的长度: 可以通过减少键的长度来解决这个问题。你可以检查表的每个键,并尝试减少键的长度,使其不超过767字节。 2. 使用不同的字符集和排序规则: 有候,如果你在创使用了特定的字符集和排序规则,会导致键的长度变长。你可以尝试使用不同的字符集和排序规则,以确保键的长度在限制范围内。 3. 使用前缀索引: 如果键的长度依然超过限制,你可以考虑使用前缀索引。前缀索引只使用键的一部分作为索引,从而减少了键的长度。 4. 升级MySQL版本: 如果你使用的是较旧的MySQL版本,你可以尝试升级到最新版本。最新版本的MySQL通常会解决一些旧版本中存在的限制和问题。 综上所述,SQL错误1071 "Specified key was too long; max key length is 767 bytes" 是由于键的长度超过了MySQL的最大限制引起的。你可以通过缩短键的长度、使用不同的字符集和排序规则、使用前缀索引或升级MySQL版本来解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes](https://blog.csdn.net/weixin_39841572/article/details/113251789)[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* [【数据库】[Err] 1071 - Specified key was too longmax key length is 767 bytes](https://blog.csdn.net/weixin_53791978/article/details/128857775)[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、付费专栏及课程。

余额充值