jseesite4 脚本执行索引在MySQL 5.7 提示Specified key was too long; max key length is 3072 bytes的解决

Error executing: CREATE INDEX idx_bpm_form_pcs ON js_bpm_form (parent_codes ASC) .  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 3072 bytes

出现这个错误(ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes)的原因是因为 InnoDB 表引擎的限制:

默认情况下,索引前缀长度限制为 767 字节,当开启了 innodb_large_prefix 选项时,索引前缀长度扩展到 3072 字节。

jseesite4 脚本执行索引在MySQL 5.7 提示Specified key was too long; max key length is 3072 bytes的解决
SHOW VARIABLES LIKE '%innodb_large_prefix%';
另外,索引前缀长度还和 InnoDB 的 page size 有关。innodb_page_size 选项默认是 16KB 的时候,最长索引前缀长度是 3072 字节,如果是 8KB 的时候,最长索引前缀长度是 1536 字节,4KB 的时候,是 768 字节。

jseesite4 脚本执行索引在MySQL 5.7 提示Specified key was too long; max key length is 3072 bytes的解决
SHOW VARIABLES LIKE '%innodb_page_size%';
所有支持的字符集及其字节占用情况:

jseesite4 脚本执行索引在MySQL 5.7 提示Specified key was too long; max key length is 3072 bytes的解决
SHOW CHARACTER SET;
如果表的字符集是 utf8mb4 时,一个字符将占用 4 个字节。这意味着索引前缀最大长度为 3072 字节时,只能容纳 3072 / 4 = 768 个字符。因此只要将上面图中的建表语句索引字段的前缀长度设为 768 就行了:

jseesite4 脚本执行索引在MySQL 5.7 提示Specified key was too long; max key length is 3072 bytes的解决

SQL改为:CREATE INDEX idx_bpm_form_pcs ON js_bpm_form (parent_codes(768) ASC);