MySql - Specified key was too long; max key length is 767 bytes 的解决方案
在做一次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);