WampServer导入MySQL遇#1071键过长错误,求配置调整方法
解决MySQL #1071 索引长度超出限制的问题
问题原因
你遇到的#1071错误核心原因是MyISAM引擎对联合索引的总长度限制为1000字节,而你的表使用了utf8mb4字符集(每个字符占4字节):
subscription_id是bigint(20) UNSIGNED,占8字节stripe_plan是varchar(255),按utf8mb4计算为255*4=1020字节
两者总和8+1020=1028字节,超过了1000字节的上限。旧版Wamp可能默认使用utf8字符集(每个字符3字节),255*3+8=773字节未触发限制,所以能正常运行。
解决办法
1. 切换到InnoDB引擎(推荐方案)
InnoDB是MySQL当前的默认引擎,对索引长度的限制更宽松(开启innodb_large_prefix后支持单索引最大3072字节),同时支持事务、行锁等更优特性。修改CREATE TABLE语句的引擎部分即可:
DROP TABLE IF EXISTS `subscription_items`; CREATE TABLE IF NOT EXISTS `subscription_items` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, `subscription_id` bigint(20) UNSIGNED NOT NULL, `stripe_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `stripe_plan` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `quantity` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `subscription_items_subscription_id_stripe_plan_unique` (`subscription_id`,`stripe_plan`) USING HASH, KEY `subscription_items_stripe_id_index` (`stripe_id`(250)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2. 缩短联合索引中stripe_plan的长度
如果必须保留MyISAM引擎,可调整stripe_plan的索引长度,让总字节数控制在1000以内:
计算可得:(1000-8)/4=248,将联合索引里的stripe_plan改为取前248个字符:
UNIQUE KEY `subscription_items_subscription_id_stripe_plan_unique` (`subscription_id`,`stripe_plan`(248)) USING HASH,
3. 改用utf8字符集(仅适用于无需4字节字符场景)
如果你的业务不需要存储emoji或其他4字节Unicode字符,可将字符集改为utf8(每个字符3字节),此时255*3+8=773字节,不会超出MyISAM的索引限制:
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
4. 修改MySQL配置(针对InnoDB大索引支持)
如果切换InnoDB后仍存在索引长度问题,可修改Wamp的my.ini配置文件:
找到[mysqld]段落,添加或修改以下参数:
innodb_file_format = Barracuda innodb_file_per_table = 1 innodb_large_prefix = 1
修改完成后重启WampServer的MySQL服务即可生效。
内容的提问来源于stack exchange,提问作者Robert Young
相关产品推荐
相关产品推荐

