首页 > 解决方案 > 未索引的列,mysql 错误“指定的键太长最大键长度为 767 字节”

问题描述

MySQL版本是5.6.23,为什么增加一个varchar类型的unindexed column,长度从1024到2048,MySQL提示'mysql error specified key was too long max key length is 767 bytes'。

我检查了column(ccer)没有被索引,定义是:ccervarchar(1024) DEFAULT NULL COMMENT '抄送人(姓名格式,多用;隔开)'。下面是表定义:

CREATE TABLE `send` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `createTime` datetime NOT NULL,
  `updateTime` datetime DEFAULT NULL,
  `ccer` varchar(1024) DEFAULT NULL COMMENT '抄送人(name<address>格式,多个用;隔开)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

我知道如果列被索引,键的长度是有限的。但是该列没有被索引,为什么会出现这个错误?

在我执行以下命令后:

set global innodb_large_prefix=1;
set global innodb_file_format=BARRACUDA;

我可以将列ccer大小从 1024 扩展到 2048。

标签: mysql

解决方案


其他事情正在发生。如果列不包含在任何索引中,我们可以修改字符列的长度以增加其长度,而不会提高最大键长度错误。

演示(注意innodb_large_prefix设置为 ON)

USE `test`
;
SHOW VARIABLES LIKE 'version'
;
-- Variable_name  Value
-- -------------  ---------------------------
-- version        5.7.17-0ubuntu0.16.04.1-log

SHOW VARIABLES LIKE 'innodb_large_prefix'
;
-- Variable_name        Value   
-- -------------------  --------
-- innodb_large_prefix  ON 

CREATE TABLE `send` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `createTime` DATETIME NOT NULL,
  `updateTime` DATETIME DEFAULT NULL,
  `ccer` VARCHAR(1024) DEFAULT NULL COMMENT '抄送人(name<address>格式,多个用;隔开)',
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4
;

-- 0 row(s) affected

INSERT INTO `send` VALUES (NULL,NOW(),NOW(),'')
;

-- 1 row(s) affected

ALTER TABLE `send`
  CHANGE `ccer` `ccer` VARCHAR(2048) DEFAULT NULL COMMENT '抄送人(name<address>格式,多个用;隔开)'
;

-- 0 row(s) affected

SHOW CREATE TABLE `send` ;

-- CREATE TABLE `send` (
--   `id` bigint(20) NOT NULL AUTO_INCREMENT,
--   `createTime` datetime NOT NULL,
--   `updateTime` datetime DEFAULT NULL,
--   `ccer` varchar(2048) DEFAULT NULL COMMENT '抄送人(name<address>格式,多个用;隔开)',
--   PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4

我认为除了更改未包含在索引中的列的定义之外,还有其他事情发生。


推荐阅读