mysql - 未索引的列,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)没有被索引,定义是: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;
我知道如果列被索引,键的长度是有限的。但是该列没有被索引,为什么会出现这个错误?
在我执行以下命令后:
set global innodb_large_prefix=1;
set global innodb_file_format=BARRACUDA;
我可以将列ccer
大小从 1024 扩展到 2048。
解决方案
其他事情正在发生。如果列不包含在任何索引中,我们可以修改字符列的长度以增加其长度,而不会提高最大键长度错误。
演示(注意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
我认为除了更改未包含在索引中的列的定义之外,还有其他事情发生。
推荐阅读
- php - 正则表达式在 Regexr 工具中工作,但不在 PHP 中
- python - 网页抓取 vaadin python
- sql-server - SQL Server - 始终根据条件向上或向下舍入
- android - 数据绑定 NoSuchMethodError 与 buildtools 3.4.0
- angular - “对象”类型的参数不能分配给“字符串”类型的参数
- puppet - 如何将键读入数组?
- python - 插入 python mysql 不在数据库中更新
- pygame - 我不断收到此错误:无法打开“文件”
- java - 创建名为“homeController”的 bean 时出错:注入自动装配的依赖项失败
- android - TalkBack 在不同设备上处理 `view.requestFocus()` 的方式不一致