小樱 发表于 2024/5/11 19:55

宝塔导出网站mysql5.7的sql数据库备份文件无法还原迁移到其它机器,错误码1071 - Specified key was too long; max key length is 767 bytes,utf8mb4的坑

宝塔导出网站mysql5.7的sql数据库备份文件无法还原迁移到其它机器,错误码1071 - Specified key was too long; max key length is 767 bytes,utf8mb4的坑

错误
SQL 查询:
CREATETABLE`wp_aioseo_crawl_cleanup_blocked_args`(
`id`BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENT,
`key`TEXTCOLLATEutf8mb4_unicode_520_ci,
`value`TEXTCOLLATEutf8mb4_unicode_520_ci,
`key_value_hash`VARCHAR(40)COLLATEutf8mb4_unicode_520_ciDEFAULTNULL,
`regex`VARCHAR(255)COLLATEutf8mb4_unicode_520_ciDEFAULTNULL,
`hits`INT(20)NOTNULLDEFAULT'0',
`created`DATETIMENOTNULL,
`updated`DATETIMENOTNULL,
PRIMARYKEY(`id`),
UNIQUEKEY`ndx_aioseo_crawl_cleanup_blocked_args_key_value_hash`(`key_value_hash`),
UNIQUEKEY`ndx_aioseo_crawl_cleanup_blocked_args_regex`(`regex`))ENGINE=INNODBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_520_ci;

MySQL 返回:

#1071 - Specified key was too long; max key length is 767 bytes

原因:MySQL 索引只支持767个字节,但是VARCHAR却错误的赋予了数值255,由于每个utf8mb4需要占用4字节,所以最大值应当为191

解决办法1,推荐
通过记事本打开sql编辑或者使用sqlitestudio进行编辑都可以,数值改成191后恢复正常

解决办法2,此方法比较复杂而且应用场景很少,这里不做过多的介绍
想要支持更长的索引,那么创建表的时候需要使用row_format=DYNAMIC

chungbin 发表于 2024/5/14 11:03

这个问题是迁移导入到mysql5.6时出现

解决方法1:修改regex结构的VARCHAR(255)为VARCHAR(191)

解决方法2:升级mysql为5.7
页: [1]
查看完整版本: 宝塔导出网站mysql5.7的sql数据库备份文件无法还原迁移到其它机器,错误码1071 - Specified key was too long; max key length is 767 bytes,utf8mb4的坑