在 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 个字符来创立索引。
⑤ 手动创立索引:如果主动生成的索引长度太长,能够思考手动创立索引并指定较短的索引长度。须要留神的是,更改数据库配置或表格构造可能会影响现有的数据。在执行任何更改之前,请务必备份你的数据。