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

智能推荐

Nginx配置https后报错the ssl parameter requires-程序员宅基地

文章浏览阅读5.1k次,点赞4次,收藏5次。1. 报错描述 Nginx配置好Https后启动报错: the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf2. 解决方法进入Nginx安装包执行命令配置Nginx的http和https ./configure --prefix=/usr/l..._the ssl parameter

directfb之diretfbrc详解_directfb directfbrc-程序员宅基地

文章浏览阅读2.9k次。directfbrc 是DirectFB的配置文件。它被所有的DirectFB应用程序在启动时读取,有两个这样的文件,一个是存放在/etc/direcfbrc,是个全 局的,另一个是存放在$HOME/.directfbrc,它是个局部的,可以覆盖系统的设置。需要注意的是,这两个文件都不是默认存在 的,是需要你自己建立的,不要象我一样,刚开始的时候到处找也没有找到,呵呵。在direc_directfb directfbrc

利用gnome美化Ubuntu18.04_gnome-shell ubuntu18-程序员宅基地

文章浏览阅读9.9k次。先上最终的效果图:首先需要安装gnome软件sudo apt install gnome-tweak-tool安装好后在terminal中输入 gnome-tweaks 进入优化软件软件里自带有一些主题和图标等,可以根据自己的喜好选择,还有一些其它的设置比如缩放、设置壁纸等,就需要自己摸索了。如果对于自带的主题和图标不满意的话还可以去网站上下载自己满意的,下面就详细说..._gnome-shell ubuntu18

NAT Tools and Settings-程序员宅基地

文章浏览阅读1.3k次。NAT Tools and SettingsUpdated: March 28, 2003 In this section • NAT Tools if(typeof(IsPrinterFriendly) != "undefined

昂科烧录器支持Silicon labs芯科科技蓝牙芯片EFR32BG22C112F352GM32-程序员宅基地

文章浏览阅读710次,点赞11次,收藏20次。凭借高达0 dBm的最大功率输出和-98.9 (1 Mbit/s GFSK) dBm的卓越接收灵敏度,EFR32BG22C112F352GM32可提供强大的RF链路,以便在蓝牙LE数据传输、位置服务和低功耗节点应用中实现可靠的通信和行业领先的能效。主机背部有SD卡槽,将PC软件制作得到的工程文件放到SD卡的根目录下并插入到该卡槽内,通过编程器上的按键可进行工程文件的选择,加载,执行烧录等命令,以达到脱离PC便可操作的目的,极大地降低了PC硬件配置成本,方便迅速地搭配工作环境。

HTML5颜色渐变3D文字特效-程序员宅基地

文章浏览阅读243次。在线演示 本地下载 _html5 文字3d

随便推点

深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析-程序员宅基地

文章浏览阅读457次。通过本文的讲解,读者可以全面了解iOS开发的基础知识和关键流程,从创建第一个iOS程序到纯代码实现开发,涵盖了多个方面的内容。希望本文能够帮助读者更好地入门iOS开发,提升开发技能和实践经验。

UnicodeDecodeError: ‘gb2312‘ codec can‘t decode byte 0xc4 in position 21635: illegal multibyte seque_in position 4:illegal multibyte sequence-程序员宅基地

文章浏览阅读154次。UnicodeDecodeError: 'gb2312' codec can't decode byte 0xc4 in position 21635: illegal multibyte seque_in position 4:illegal multibyte sequence

第1章 统计学习方法概论(LeastSquaresMethod)代码实现-程序员宅基地

文章浏览阅读3k次,点赞7次,收藏6次。上一篇:【目录】====== 【回到目录】====== 下一篇:【第一章课后习题参考解答】import numpy as npfrom scipy.optimize import leastsqimport matplotlib.pyplot as plt# 目标函数def real_func(x): return np.sin(2*np.pi*x)# 多项式def fi...

saas 测试_为什么SaaS公司需要进行安全测试?-程序员宅基地

文章浏览阅读4k次。saas 测试 SaaS公司在为客户提供基本软件解决方案时提供了很大的灵活性。 它们具有易于访问的附加优点,并且在所有类型的设备上也很容易访问。 结果,现代企业正在Swift转向SaaS供应商提供的这些解决方案。 根据KBV Research最近发布的一份报告,到2024年 ,全球SaaS市场规模有望突破 1850亿美元。这些令人鼓舞的数字已经引发了市场上的同类竞争。 大多数软件公司现在都计..._saas产品需要做测试码

基于STM32单片机智能公交车语音报站系统毕业设计RFID射频识别100X_基于stm32的rfid读卡器可以播报吗-程序员宅基地

文章浏览阅读601次,点赞9次,收藏9次。基于STM32单片机的智能公交车语音报站系统设计RFID射频识别站台信息JR6001语音播报电机控制开关门DIY开发板套件100。_基于stm32的rfid读卡器可以播报吗

【干货】网易云音乐歌单的推荐算法解析-程序员宅基地

文章浏览阅读722次。网易云音乐的歌单推荐算法是怎样的呢?最近有很多人关心这个问题。调查了一些网易云音乐的重度患者,小咖带你来看一些路过大神的精辟分析。分析一:“商品推荐”系统的算法( Collaborati..._网易云音乐推荐算法csdn