SQL错误(1071)Specified key was too long:max key length is 767 bytes
这个报错信息的大概意思就是主键的长度超过了767bytes,注意,是主键
综合网上文章,解决方法有三种:(详述第三种)
1.查看数据库的字符集
我的不是字符集错误的原因,看了这么多文章之后加上实践觉得这个方法不太行,因此具体方法就不列出了
2.升级数据库版本
一般情况下能解决问题,如果之前设置的主键不是太长
因为mysql的版本升级后,支持的主键的字节长度也有增长
原文: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.
但是由于一些原因,我没被允许升级mysql的版本
3.修改数据库主键长度(即字段长度)
网络上有很多计算字段长度的文章,我这里就不赘言了,主要详述修改字段的过程.
我是在本地的数据库导出的sql,然后远程在别的服务器上创建数据库.在远程运行sql文件的时候报的标题中的错误.
(1)使用只含结构的sql文件
由于sql文件太大,不方便,因此我重新在本地导了一个只含结构,不含数据的sql文件,这样文件小很多,运行起来会比较快
(2)找出过长的字段
在远程使用的数据库工具是Heidisql,这个看报错日志很方便,但是如果有数据的大sql文件运行起来会很慢.
然后就是在远程的Heidisql中运行sql文件,运行的时候找到错误提示,然后就能找到是哪个表的主键超过长度,导致报错
改的时候记录是哪张表,一直改一直改(删除表,然后重建数据库,重新运行改过的新sql 或者清空表),直到不报错,能够成功运行整个sql文件.(我需要改的字段比较少,但是这可能是个笨办法,欢迎指正!!!)
(3)修改本地的表,重新导出含数据含结构的sql文件
照着前面记录下来的表名,去本地数据库修改这个表中超出长度的字段的长度.
然后重新导出sql文件,含数据含结构的.
(4)重新去远程导入sql文件
使用的数据库工具是navicat(Heidisql运行大sql文件很慢)
用完整的sql文件重新运行就好了
我知道这个方法比较麻烦,但是由于"居然还可以这么搞"的心理,还是记录下来了.
目前不知道有没有更好的办法.
欢迎批评指正.
参考文章:
https://blog.csdn.net/ljfphp/article/details/80406907
合理设置索引长度
https://blog.csdn.net/zhangyingchengqi/article/details/73249996
https://blog.csdn.net/songmaolin_csdn/article/details/72621357