mysql导入报错1071_导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes...-程序员宅基地

技术标签: mysql导入报错1071  

一、背景

今天把服务器的数据库导出了一份sql文件,准备导入到本地,但是在导入的时候,报了个错:

Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

这就很奇怪了,明明服务器上都可以,凭什么我这边就报错呢。

二、错误分析

1、错误部分的sql文件

CREATE TABLE `model_has_permissions` (

`permission_id` int(10) unsigned NOT NULL,

`model_id` int(10) unsigned NOT NULL,

`model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,

PRIMARY KEY (`permission_id`,`model_id`,`model_type`),

KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`),

就是这个primary key部分报错的。错误信息的意思是,设置的键长超过了767 bytes。

2、这个767 bytes是什么玩意?

答:

(1)

在mysql 5.5.3之前,mysql的InnoDB引擎,要求设置的主键长度不得超过767bytes。

mysql的MyIsam引擎的主键长度不得超过1000 bytes。

(2)

在mysql中,gbk字符集会占用2个字节。utf8字符会占用3个字节。

而且从mysql5.5.3之后的版本,mysql 开始支持utf8m4字符,代表着一个字符占用4个字节。

也就是说:

(255+10+10)*3 = 825 //在用utf8作为字符集的时候,超过了规定的767 bytes

(255+10+10)*2 = 550 //当该用gbk作为字符集的时候

(255+10+10)*4 = 1100 //当用utf8m4作为字符集的时候,也超标了

3、大致原因知道之后,查看sql文件

(1)、数据库使用的InnoDB引擎

(2)、数据库使用utf8m4作为字符集

三、解决办法

1、修改字符长度

//根据上面的分析可以进行计算,我的主键长度不能超过192

768/4 = 192

但这样很明显是不符合的需求的,不能随便改动数据库的字段!

2、升级mysql

这个方案是在查询服务器数据库版本的时候,发现服务器数据库采用的是mysql5.7版本。。也就是说在升级数据库之后,是完全可以达到的。。

原文:

767 bytes is the stated prefix limitation for InnoDB tables in MySQL version 5.6 (and prior versions). It's 1,000 bytes long for MyISAM tables. In MySQL version 5.7 and upwards this limit has been increased to 3072 bytes.

1

原文的意思是说,在mysql的5.5.3版本之前,InnoDB引擎的主键对应的最大字节数是767字节,MyISAM对应的主键最大字节是1000字节。但是在mysql5.7版本之后,最大主键字节增大为3072字节。

OK,这样就很明显了,升级mysql是最佳的选择。用集成环境的小伙伴可以关闭集成环境中的mysql,然后下载最新的mysql版本即可。

四、在解决问题时,学到的东西

1、查看数据库的存储引擎

//进入数据库,执行这个命令

show variables like '%storage_engine%';

2、查看当前数据库的字符编码

show variables like '%character_set%';

1

3、查看数据库的版本号

//进入数据库之后,执行status即可

mysql>status

4、关于varchar

MySQL5.0.3之前varchar(n)这里的n表示字节数

MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个

5、关于用varchar作为主键,不好的地方

varchar相对于int来说占用磁盘空间多,磁盘io也会多,然后内存带宽也会多。这点上尤其在innodb更为明显,innodb表的Secondary index的 leaf page中都要保存primary key的值,主键如果是varchar,会导致secondary index的体积会比较大。而且varchar主键在比较上也会慢一些,插入时容易发送数据的非顺序插入,导致碎片,index tree效率比int低

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39841572/article/details/113251789

智能推荐

PCONV:移动设备上的DNN权重剪枝中的稀疏性-程序员宅基地

文章浏览阅读844次。基于深度神经网络(DNN)的模型压缩技术已被广泛认为是在各种平台上实现加速的有效方法,而DNN权重剪枝是一种简单有效的模型压缩方法。目前有两种主流的剪枝方法代表了剪枝的两个极端:非结构化、细粒度的剪枝可以实现高稀疏性和准确性,但对硬件不友好;结构化、粗粒度的剪枝利用了硬件高效的结构,但当压缩率高时,精度会下降。在本文中,我们介绍了PCONV,它包括一个新的稀疏性维度,即粗粒度结构中的细粒度修剪模式。_pconv

Android电话本数据查询总结-程序员宅基地

文章浏览阅读1.7k次。该文总结下工作当中维护的联系人模块中的数据查询流程。该流程在很多系统APP上都类似,了解这个过程还是很有必要的。在Android应用框架中一般都会划分为三层:数据层、数据访问层和业务层。数据层基本都是用sqlite来存储数据,数据访问层是借用四大组件中的内容提供器来实现,业务层就是各个应用,比如电话本。三层结构如下图所示:这里将详细总结下电话本对数据库的查询流程。1、创建数据库_电话本数据

CodeBlocks下载与安装教程_code blocks-程序员宅基地

文章浏览阅读10w+次,点赞271次,收藏633次。一、下载教程1.在浏览器上搜索CodeBlocks官网或者直接输入网址http://www.codeblocks.org/ 进入CodeBlocks官网。2.进入下载页面Downloads,一般都会选择第一个Download the binary release(二进制版本)3.进入之后,就会出来很多版本,我们要选择一个合适的版本,一般都会下载自带编译器的版本,这里到后面安装的..._code blocks

如何将输入的内容通过点击按钮显示在下方textview里并改变其颜色_如何在Photoshop中制作渐变...-程序员宅基地

文章浏览阅读151次。将展示如何在Photoshop中创建渐变,以及如何在Photoshop中加载和保存预设渐变。渐变是两种或多种颜色(或相同颜色的不同色度)的逐渐混合。渐变的常见用途包括添加光/阴影效果,增加对象的体积以及创建反射性表面,例如金属材料和金。颜色渐变的其他非常流行的用途包括创建抽象背景,添加颜色覆盖图和强调品牌标识。即使是细微的渐变也可以发挥很大作用。更多内容欢迎加入绘画交流群:308 250 976..._xaml如何将输入的文本在点击按钮后保存下来

计算机网络职业评估报告,计算机网络技术专业个人职业生涯规划书.doc-程序员宅基地

文章浏览阅读1.5k次。计算机网络技术专业个人职业生涯规划书一 前 言——及时规划职业,做自己人生之舟的船长亚里士多德曾说过:“人是一种寻找目标的动物,他生活的意义仅仅在于是否正在寻找和追求自己的目标。”而这目标有大有小,有短期的也有用尽一生去完成的。目标也有多方面的有涉及学业、家庭、工作等。如今我们正处于20岁左右,无论根据萨帕的职业生涯发展五阶段理论,即成长期(1~14岁)、探索期(15~24岁)、确立期(25~..._计算机网络技术生涯发展报告

【Android进阶】ListView使用“内存双缓存+硬盘缓存”加载网络图片_xml安卓listview 开启双缓存-程序员宅基地

文章浏览阅读1.1k次。ListView 加载网络图片是我们经常用到的方式,如果每次滚动ListView就去网络下载图片会非常影响性能(因为网络下载是比较慢的)而且非常耗费流量,所以这里介绍一种使用“内存双缓存+硬盘缓存”的方式来加载图片。实现的效果如下:这里使用了滚动时不去网络下载图片,停止时才加载,所以滚动时显示默认的,注意观察设计思想内存读取速度 > 文件读取速度> 从网络获取的_xml安卓listview 开启双缓存

随便推点

SSRF服务器端请求伪造-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏3次。SSRF服务器端请求伪造SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造恶意数据,形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统,正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制,比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等SSRF常见场景_ssrf服务器端请求伪造

java/jsp/ssm电影院在线售票系统【2024年毕设】-程序员宅基地

文章浏览阅读72次。springboot基于微信小程序的汽车租赁系统的设计与实现。开发软件:eclipse/myeclipse/idea。springboot基于微信小程序的hpv疫苗预约系统。springboot基于协同过滤算法的音乐推荐系统。springboot毕设课题的选择和申报管理系统。springboot基于微信小程序的校园跑腿平台。springboot基于Java的图书购物商城。ssm基于vue的高校宿舍报修系统的设计与实现。ssm微信小程序的外卖点餐系统的设计与实现。jsp信阳学院学生体能达标系统的设计与实现。

【问题】Could not autowire. No beans of … type found-程序员宅基地

文章浏览阅读96次。怎么处理?除了把他隐藏 还有啥方法?转载于:https://www.cnblogs.com/CESC4/p/7358995.html_can not autowire no beans of decoder

Python3 迭代器与生成器_python3迭代器-程序员宅基地

文章浏览阅读153次。迭代是Python最强大的功能之一,是访问集合元素的一种方式。_python3迭代器

ES6新特性-程序员宅基地

文章浏览阅读2w次,点赞9次,收藏42次。ES6新特性_es6新特性

UI设计资料_设计是什么保罗.兰德百度网盘资源-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏8次。设计软件链接:https://pan.baidu.com/s/1cGu6fW 密码:f2k630G教学视频:https://pan.baidu.com/s/1nvrB6jv 密码:bruv朋友发的,就这么刚!_设计是什么保罗.兰德百度网盘资源