未索引的列,mysql错误';指定的密钥太长,最大密钥长度为767字节';

未索引的列,mysql错误';指定的密钥太长,最大密钥长度为767字节';,mysql,Mysql,MySQL版本是5.6.23,为什么要增加一个varchar类型的未索引列,长度从1024增加到2048,MySQL提示“MySQL错误指定的密钥太长,最大密钥长度为767字节” 我检查了列(ccer)是否没有索引,定义是:ccervarchar(1024)DEFAULT NULL COMMENT'抄送人(姓名)格式,多个用;隔开)'. 下表为定义: CREATE TABLE `send` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `creat

MySQL版本是5.6.23,为什么要增加一个varchar类型的未索引列,长度从1024增加到2048,MySQL提示“MySQL错误指定的密钥太长,最大密钥长度为767字节”

我检查了列(ccer)是否没有索引,定义是:
ccer
varchar(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;

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

还有其他问题。如果任何索引中都不包含列,我们可以修改字符列的长度以增加其长度,而不会引起最大键长度错误

演示(注意:innodb\u large\u前缀设置为ON)



altertable`send`
更改'ccer``ccer`VARCHAR(2048)默认空注释'抄送人(姓名)格式,多个用;隔开)'
;
--0行受影响

显示创建表'send';
--创建表“发送”(
--`id`bigint(20)非空自动增量,
--`createTime`datetime不为空,
--`updateTime`datetime默认值为空,
--`ccer`varchar(2048)默认空注释'抄送人(姓名)格式,多个用;隔开)',
--主键(`id`)
--)引擎=InnoDB自动增量=2默认字符集=utf8mb4


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

执行
show create table
以显示表上的索引;索引(或mysql术语中的“键”)未包含在列定义中。此问题缺少表的实际定义,以及为尝试“增加”而执行的实际语句列的长度。对于某些innodb行格式,可以通过设置
innodb\u large\u prefix
来覆盖767字节的限制。@spencer7593我已添加了表定义。您正在更改表。它失败了。原因:您试图索引
ccer
。您无法发布
创建表
,成功后忽略
alter table
失败。@spncer7593在我执行以下命令后:设置全局innodb_large_prefix=1;设置全局innodb_file_format=BARRACUDA;我可以将列ccer大小从1024扩展到2048。我只是不知道为什么。我们知道错误与innodb存储引擎有关,每个人都使用每个表的文件,所以我们只使用文件格式(传统的羚羊vs较新的梭鱼)和行格式。一个常见的tripup是字符集,每个字符有多个字节),但这里似乎不是问题,列已经是1024个字符,utf8mb4,最大4096个字节,已经超过767个字节的限制。
set global innodb_large_prefix=1;
set global innodb_file_format=BARRACUDA;
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