共计 1154 个字符,预计需要花费 3 分钟才能阅读完成。
背景:迁徙数据库的过程中,导出的表在导入新的数据库时,呈现谬误。
谬误揭示翻译:指定的键太长; 最大密钥长度为 767 字节
起因:MySql 索引长度有限度
1、TextField 是不反对建设索引的
2、MySQL 的每个单表中所创立的索引长度是有限度的, 且对不同存储引擎下的表有不同的限度。1)myisam 表,单列索引,最大长度不能超过 1000 bytes,否则会报警,然而创立胜利,最终创立的是前缀索引(取前 333 个字符)。2)myisam 表,组合索引,索引长度和不能超过 1000 bytes,否则会报错,创立失败;3)innodb 表,单列索引,超过 767 bytes 的,给出 warning,最终索引创立胜利,取前缀索引(取前 255 字符)。4)innodb 表,组合索引,各列长度不超过 767 bytes,如果有超过 767 bytes 的,则给出报警,索引最初创立胜利,然而对于超过 767 字节的列取前缀索引,与索引列程序无关,总和不得超过 3072,否则失败,无奈创立。3、MySQL 版本不同而导致的索引长度限度不同
在 MySQL5.5 版本,引入了 innodb_large_prefix,用来禁用大型前缀索引,以便与不反对大索引键前缀的晚期版本的 InnoDB 兼容
开启 innodb_large_prefix 能够使单索引的长度限度达到 3072 字节(然而联结索引总长度限度还是 3072 字节),禁用时单索引的长度限度为 767 字节
在 MySQL5.5 版本与 MySQL5.6 版本,innodb_large_prefix 是默认敞开的,在 MySQL5.7 及以上版本则默认开启
在 MySQL8.0 版本中,innodb_large_prefix 已被移除,从版本 8.0 开始,索引长度限度由表字段 (row format) 决定,若为 DYNAMIC 或 COMPRESSED 时,限度值为 3072;为 REDUNDANT 或 COMPACT 时,限度值为 767。为什么 3072:InnoDB 一个 page 的默认大小是 16 k。因为是 Btree 组织,要求叶子节点上一个 page 至多蕴含两条记录(否则就进化链表了)。所以一个记录最多不能超过 8 k。又因为 InnoDB 的聚簇索引构造,一个二级索引要蕴含主键索引,因而每个单个索引不能超过 4 k(极其状况,pk 和某个二级索引都达到这个限度)。因为须要预留和辅助空间,扣掉后不能超过 3500,取个“整数”就是(1024 * 3 = 3072)。utf8 与 utf8mb4 的区别:因为历史起因,MySQL 刚开始设计的时候,"天真的" 认为应用 3 个字节就足够存储字符串了,因而将 UTF-8 进行阉割;然而遇到简单的汉字或者 emoji 表情等 4 字节的宽字符的时候,存储就会出现异常,因而在版本 5.7.3 开始引入 utf8mb4,其示意为 most bytes 4,即最多占用 4 个字节。
正文完