
# Oracle到MySQL迁移时，索引超长如何处理
#### 索引长度说明
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         |
| InnoDB | 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请用实际约束名代替。
  
 
