mysql在创建数据库的时候,字符集设置的不是utf8而是utf9mb4,在导入sql脚本的时候,发现提示如下错误:

从上图中,我们可以看出,使用的是innodb及字符集。错误提示是长度太长了:Specified key was too long; max key length is 767 bytes

来查看下创建表的语句:

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;

varchar的长度明明设置的是255啊。怎么会报出767 bytes的错误呢?

我们在看看错误提示:

[Err] 1071 - Specified key was too long; max key length is 767 bytes。

这个就是因为联合所以长度限制的。

我们来看看MySql InnoDB引擎对索引长度的限制:

mysql单索引限制:

在默认情况下,InnoDB对单一的字段索引长度限制最大为767个字节。

这个长度怎么来的呢 ?当mysql创建数据库的时候,字符集使用的是UTF-8的时候,我们知道UTF-8每个字符使用三个字节来存储的。即:256*3-1=767了。这个767字符大小的限制就是从这里来的。

联合索引(前缀索引)限制:

同样的,mysql对前缀索引也有同样的限制。根据字符集不同,长度限制也不同。

字符集使用utf8的时候长度限制是:767个

使用uft8mb4的时候长度限制是:3072个

但是,在文章一开始,凯哥就强调了,凯哥数据库使用的字符集是:utf8mb4。我们也知道,utf8mb4编码的每个字符使用四个字节来存储的。我们来计算下:256*4-1>767。

从凯哥的sql脚本可以看出:KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) 使用到了联合索引(前缀索引)。

随意凯哥数据库的字符集使用的不是utf8,但是mysql系统变量innodb_large_prefix未开启(因为凯哥使用的是默认配置)。如果系统变量innodb_large_prefix开启了,就会对使用dynamic或者是comperssed行格式的InnoD表,索引键长度限制为3072个字节了。如果没有开启这个,InnoDB会对,无论什么表索引键长度限制都是767了。

解决方案有两种:
1:mysql系统变量innodb_large_prefix开启。

需要修改配置,重启mysql服务等等。。。太麻烦了。凯哥这里使用了第二种方案

2:修改联合主键中每个字段的长度

联合主键的三个字段如下:

`registry_group` varchar(50) NOT NULL,

`registry_key` varchar(255) NOT NULL,

`registry_value` varchar(255) NOT NULL,

将varchar(255)的修改为varchar(100)后(注:这里的长度根据自己需求进行设置。如果非要用255个字符以上,请选择使用第一种解决方案),sql脚本就执行成功。如下图:

延伸知识点:

当遇到如下错误:

错误信息是3072的时候,说明开启了系统变量,但是还是超长了。这个时候,可以采用同样的方案来处理。

本文来源:凯哥Java(kaigejava)

mysql使用联合索引提示字符长度超限制解决办法的更多相关文章

  1. 初始化mysql数据库时提示字符编码错误的解决办法

    有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...

  2. mysql导入的时候提示“1046-No Database selected”的解决办法

    进入phpmyadmin后,先点击左边的要导入的数据库,进入后再点击右上角的“导入‘按钮即可 详细说明 http://www.xmxwl.net/help/member/20160325/13653. ...

  3. Mysql 创建联合索引注意事项

      当一个表有多条索引可走时,  Mysql  根据查询语句的成本来选择走哪条索引, 联合索引的话, 它往往计算的是第一个字段(最左边那个), 这样往往会走错索引. 如: 索引Index_1(Crea ...

  4. MySQL中的索引提示Index Hint

    MySQL数据库支持索引提示(INDEX HINT)显式的高速优化器使用了哪个索引.以下是可能需要用到INDEX HINT的情况 a)MySQL数据库的优化器错误的选择了某个索引,导致SQL运行很慢. ...

  5. mysql 5.7.20 server status 是stopped的解决办法

    mysql 5.7.20 server status 是stopped的解决办法 在安装mysql 5.7.20的过程中,前几个过程都没什么问题,但是最后一个步骤就出问题了.当check一直提示con ...

  6. eclipse自动提示功能没了的解决办法(转载)

    eclipse自动提示功能没了的解决办法 标签: eclipse联想 2012-08-09 14:32 24687人阅读 评论(7) 收藏 举报  分类: Android(38)  版权声明:本文为博 ...

  7. sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法

    sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法 金刚 sqlserver 附加数据库 拒绝访问 今天把项目拷贝到新硬盘里,发现在附加数据库中提示:操作系统错误5:"5拒绝 ...

  8. eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法

    eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法 当使用eclipse导入外部的web工程时,有时会提示HttpServletRequest, Serv ...

  9. MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法

    MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法 1 问题 [root@localhost m ...

随机推荐

  1. Ubuntu 安装VirtualBox 虚拟机

    转载 1.终端命令 编辑sources.list ? 1 sudo gedit /etc/apt/sources.list 2.添加 软件源 将下面的地址加入sources.list 的末尾,保存并退 ...

  2. 201812-2 小明放学 Java

    思路: 红绿灯每种灯亮划分区间,在[0,r]区间内红灯亮,在(r,g+r]区间内绿灯亮,在(r+g,r+g+y]区间内黄灯亮,在划分好区间后只需要判断当小明到达红绿灯时是哪个灯在亮,就可以判断出通过红 ...

  3. 吴裕雄--天生自然 JAVASCRIPT开发学习:while 循环

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 设置Apache(httpd)和Nginx 开机自启动

     方法1: 进入目录: vi  /etc/rc.d/rc.local #设置apache 和 nginx 开机自启动/usr/sbin/apachectl start/usr/sbin/nginx s ...

  5. map构造同时初始化

    Map<String, Object> mtest =  new HashMap<String, Object>(){{put("test","M ...

  6. cf1200 D White Lines(二维差分)

    题目大意 有一个大小为n的矩阵,每个1*1的单位为黑或白,我们可以用一个(只有一个)大小为k*k的白色矩阵覆盖,问:最多的时候有几条白线(横的全为白 或竖的全为白 即为白线). 思路 要想把一条线(以 ...

  7. Linux简介和环境的搭建

    Linux的学习方向 网络服务器 嵌入式程序开发 Linux的设计哲学:一切皆文件 常用命令:cd 切换目录sudo shutdown -h now 关机命令sudo reboot 重启sudo ro ...

  8. CentOS7使用firewalld的基本命令

    转自:https://www.cnblogs.com/moxiaoan/p/5683743.html.Thanks for  莫小安   1.firewalld的基本使用 启动: systemctl ...

  9. 流程引擎表单引擎的常见问题技术交流-关于广州xx公司对驰骋BPM提出

    第1章: 先使用.net 再使用java,数据迁移问题?会存在哪些问题. RE: .net 版本的ccflow与java版本的jflow系列版本都是一个数据库结构,一个操作手册,流程模版,表单模版通用 ...

  10. input只允许输入数字,并且小数点后保留4位

    <input type="text" value="" name="should_send_num" id="should_ ...