文档首页 > > 常见问题> 操作类问题> Oracle到MySQL迁移时,索引超长如何处理

Oracle到MySQL迁移时,索引超长如何处理

分享
更新时间: 2020/01/17 GMT+08:00

索引长度说明

MySQL引擎对索引长度有一些限制,最主要的因素就是存储引擎和字符集。不同的字符集,单个字符包含的最大字节数有所不同。例如 utf8 字符集,一个字符最多包含 3 个字节。而 utf8mb4 一个字符最多包含 4 个字节。
  • 如果是单字段索引,则字段长度不应超过表1中的“单字段最大字符数”。例如,MySQL 5.7.6版本的InnoDB引擎,单字段索引不应超过767个字节(字符数=767/最大字节数)。
  • 如果是联合索引,则每个字段长度均不能超过表1中的“单字段索引最大字符数”,且所有字段长度合计不应超过“联合索引合计最大字符数”。例如,MySQL 5.7.6版本的InnoDB引擎,每个字段索引不应超过767个字节(字符数=767/最大字节数),且所有字段索引长度总和不超过3072个字节(字符数=3072/最大字节数)。
表1 索引长度说明

引擎

MySQL版本

字符集

最大字节数

单字段索引最大字符数

联合索引合计最大字符数

InnoDB

MySQL 5.7.6及以下版本

utf8mb4

4

191

768

MySQL 5.7.7及以上版本

utf8mb4

4

768

768

索引超长的处理方法

  • 方法一

    不迁移含有超长索引的表。

  • 方法二

    修改源库索引长度满足以上索引长度说明中的要求,改操作可能导致迁移后数据不完整,请谨慎使用。以目标库为MySQL 5.7.6及以下版本的utf8mb4为例,可通过如下方式修改长度。

    alter table tablename modify columnname varchar2 (768) ;

其中,tablename请用实际表名代替,columnname请用实际列名代替。

  • 方法三

    在源库删除该索引及其约束。以目标库为MySQL 5.7.6及以下版本的utf8mb4为例,可通过如下方式删除索引及其约束。

    drop index indexname;
    alter table tablename drop constraint constraintname;

    其中,indexname请用实际索引名代替,tablename请用实际表名代替,constraintname请用实际约束名代替。

分享:

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区