mysql使用联合索引提示字符长度超限制解决办法
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使用联合索引提示字符长度超限制解决办法的更多相关文章
- 初始化mysql数据库时提示字符编码错误的解决办法
有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...
- mysql导入的时候提示“1046-No Database selected”的解决办法
进入phpmyadmin后,先点击左边的要导入的数据库,进入后再点击右上角的“导入‘按钮即可 详细说明 http://www.xmxwl.net/help/member/20160325/13653. ...
- Mysql 创建联合索引注意事项
当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引, 联合索引的话, 它往往计算的是第一个字段(最左边那个), 这样往往会走错索引. 如: 索引Index_1(Crea ...
- MySQL中的索引提示Index Hint
MySQL数据库支持索引提示(INDEX HINT)显式的高速优化器使用了哪个索引.以下是可能需要用到INDEX HINT的情况 a)MySQL数据库的优化器错误的选择了某个索引,导致SQL运行很慢. ...
- mysql 5.7.20 server status 是stopped的解决办法
mysql 5.7.20 server status 是stopped的解决办法 在安装mysql 5.7.20的过程中,前几个过程都没什么问题,但是最后一个步骤就出问题了.当check一直提示con ...
- eclipse自动提示功能没了的解决办法(转载)
eclipse自动提示功能没了的解决办法 标签: eclipse联想 2012-08-09 14:32 24687人阅读 评论(7) 收藏 举报 分类: Android(38) 版权声明:本文为博 ...
- sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法
sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法 金刚 sqlserver 附加数据库 拒绝访问 今天把项目拷贝到新硬盘里,发现在附加数据库中提示:操作系统错误5:"5拒绝 ...
- eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法
eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法 当使用eclipse导入外部的web工程时,有时会提示HttpServletRequest, Serv ...
- 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 ...
随机推荐
- 渗透测试 - HPP数据污染 - 原理 | 场景
Web服务器 参数获取函数 获取到的参数 PHP/Apache $_GET(“par”) Last JSP/Tomcat Request.getParameter(“par”) ...
- Python说文解字_Python之多任务_04
问:并发.并行.同步.异步.阻塞.非阻塞 答: 并发.并行: 并发是指一个时间段内(不是指的时间点),有几个程序在同一个CPU上运行,但是任意时刻只有一个程序在CPU上运行.对人类的时钟来说1秒钟能干 ...
- Delphi生成即调用带窗体的Dll
library frmDll; { Important note about DLL memory management: ShareMem must be the first unit in you ...
- 直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径
"京东零售已经成为一家典型的以技术驱动为主的零售公司".在11月19日召开的 2019京东全球科技探索者大会上,京东零售集团CEO徐雷首次阐释了京东零售的智能化零售路径. 徐雷指出 ...
- vi粘贴代码后格式混乱的问题
最近在远程终端使用vi发现从其他地方复制代码的后,粘贴到vi里面出现格式变乱的问题. 主要是因为终端通常无法区分输入是来自用户输入还是来自粘贴,所以终端也不能通知 vim 输入来自何处.在 vim 里 ...
- nfs自动挂载
服务器端 /etc/exports /mnt *(rw,sync,no_root_squash,anonuid=500,anongid=500)systemctl restart nfs 客户端 挂载 ...
- Java 知识点(二)
接<Java 知识点(一)> java的输入输出与 c 语言不同,下面介绍Java的格式: 16.因为Java的输入类Scanner,定义在java.util包中,所以Java需要输入时要 ...
- Docker部署zookeeper集群和kafka集群,实现互联
本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...
- Ubuntu的man中文包安装
apt-get install manpages-zh vi /etc/manpath.config :,$s#/usr/share/man#/usr/share/man/zh_CN#g 第一个命令: ...
- 申请FreeDomain,透过DNS转回自己的Godaddy Cpanel
148.66.136.216这个IP,是我的Cpanel IP. 过了几分钟,这个kkchan.tk就转到Cpanel了. 然后在Cpanel的Addon Domains加上kkchan.tk,那就可 ...