今天在本地创建了一个mysql数据库,然后运行了sql,报错了,在服务器的mysql上执行是没问题的,错误信息是:
1071 Specified key was too long; max key length is 767 bytes
然后就想到了,服务器上是5.7的,
而我本地的mysql版本是5.6的,就是版本导致的问题,那么为什么一般都不会出现问题,今天反而出现了呢?
查找发现就是这个primary key部分报错的。错误信息的意思是,设置的键长超过了767 bytes。在mysql 5.5.3之前,mysql的InnoDB引擎,要求设置的主键长度不得超过767bytes。mysql的MyIsam引擎的主键长度不得超过1000 bytes。
在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作为字符集的时候,也超标了
找到问题了自然就有解决方法了:
1、修改字符长度
//根据上面的分析可以进行计算,我的主键长度不能超过192
768/4 = 192 // 但这样很明显是不符合的需求的,不能随便改动数据库的字段!
2、设置数据库属性 由utf8mb4转为utf8 。
这两个区别是 utf8mb4多了emoji编码支持,而utf8不支持,如果你想要支持emoji,那么就不能这样操作。
3、升级mysql
服务器数据库采用的是mysql5.7版本。升级数据库问题就会解决。