学而实习之 不亦乐乎

MySql - Specified key was too long; max key length is 767 bytes 的解决方案

2023-03-01 21:40:17

在做一次mysql数据表迁移的时候碰到了这个问题。这是因为在mysql5.6中索引列的最大长度为767个字节。

如果你将某列加入到索引中,而索引的内容大于767个字节,那么将会出现这个错误。而对于一般建表来说,我们使用的多是int、tinyint、varchar这种类型。

一、查看配置并解决

1. 查看MySQL数据库当前的配置

show variables like 'innodb_large_prefix'; 

2. 修改配置

可以通过执行以下语句来修改配置

set global innodb_large_prefix=ON;//开启不限制索引长度

3. 建表时指定 ROW_FORMAT=Dynamic 或 compressed

CREATE TABLE `xxl_job_registry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `registry_group` varchar(50) NOT NULL,
  `registry_key` varchar(255) NOT NULL,
  `registry_value` varchar(255) NOT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 ROW_FROMAT=Dynamic;

这样就可以了。

二、其他方法

出现这个问题并不只有上面所说的情况,这里推荐以下办法来解决你所遇到的问题。

1、前缀索引,不使用列的全部内容作为索引,使用一部分,例如在原有的例子中我们使用了test列作为索引无法建表,但是如果改为使用test(255)作为索引就可以了,这就是所谓的使用前缀索引:
mysql> create table test(`test` varchar(256),key `IDX_TEST` (test(255))) ENGINE=InnoDB DEFAULT CHARSET=GBK;

2、升级mysql(innodb_large_prefix 这个属性在 MySql 5.6 上是默认关闭的,而在 5.7 上是默认开启的);
3、缩小索引长度(256缩小到255以下);
4、修改字符集(utf-8修改到GBK);