MySQL中 Specified key was too long; max key length is 的问题

在 MySQL 中,varchar(n) 类型的字段的索引长度取决于使用的字符集和排序规则。在 utf8 字符集下,每个字符需要最多 3 个字节来编码,而在 utf8mb4 字符集下,每个字符需要最多 4 个字节来编码。

假设我们使用的是 utf8mb4 字符集和 utf8mb4_general_ci 排序规则,那么一个 varchar(100) 的字段的最大索引长度为 333 个字节(100 * 4 * 0.83)。这里的 0.83 是因为 utf8mb4_general_ci 排序规则下,索引需要使用一个额外的字节来存储字符集规则,因此索引长度会略微减少。

如果我们使用的是 utf8 字符集和 utf8_general_ci 排序规则,那么一个 varchar(100) 的字段的最大索引长度为 250 个字节(100 * 3 * 0.83)。这里的 0.83 同样是因为 utf8_general_ci 排序规则下,索引需要使用一个额外的字节来存储字符集规则。
因此,可以看出,在相同的 varchar(n) 字段下,使用 utf8mb4 字符集和 utf8mb4_general_ci 排序规则时,索引长度会比使用 utf8 字符集和 utf8_general_ci 排序规则时多出一些字节。

这个错误通常出现在 MySQL 或 MariaDB 数据库中,表示试图创建一个超过索引长度限制的索引。
解决这个问题的方法取决于你使用的数据库版本和配置。下面是一些可能的解决方案:

① 新数据库版本:在一些较老的 MySQL 或 MariaDB 版本中,索引长度限制较低。升级到新版本可能会增加索引长度限制。
② 更改表格字符集和排序规则:在一些字符集和排序规则中,每个字符需要更多的字节来编码。例如,在 utf8mb4 字符集和 utf8mb4_general_ci 排序规则下,每个字符需要 4 个字节来编码。更改为较短的字符集和排序规则(例如 utf8 或 utf8_general_ci)可能会减少索引长度。
③ 更改字段类型:如果你的表格中有一些较长的字段,可以考虑将它们的类型更改为较短的类型。例如,将 varchar(255) 更改为 varchar(50) 可以减少索引长度。
④ 使用前缀索引:前缀索引只使用字段值的前几个字符来创建索引。这可以减少索引长度。例如,CREATE INDEX idx_name ON mytable (name(20)); 只会使用 name 字段的前 20 个字符来创建索引。
⑤ 手动创建索引:如果自动生成的索引长度太长,可以考虑手动创建索引并指定较短的索引长度。

需要注意的是,更改数据库配置或表格结构可能会影响现有的数据。在执行任何更改之前,请务必备份你的数据。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!