首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >#1071 -指定的密钥太长;最大密钥长度为1000字节

#1071 -指定的密钥太长;最大密钥长度为1000字节
EN

Stack Overflow用户
提问于 2012-01-06 00:42:09
回答 8查看 196.4K关注 0票数 131

我知道这个标题的问题以前已经回答过了,但请继续阅读。在发帖之前,我已经彻底阅读了关于这个错误的所有其他问题/答案。

我收到以下查询的上述错误:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` (
  `menu_id` varchar(32) NOT NULL,
  `parent_menu_id` int(32) unsigned DEFAULT NULL,
  `menu_name` varchar(255) DEFAULT NULL,
  `menu_link` varchar(255) DEFAULT NULL,
  `plugin` varchar(255) DEFAULT NULL,
  `menu_type` int(1) DEFAULT NULL,
  `extend` varchar(255) DEFAULT NULL,
  `new_window` int(1) DEFAULT NULL,
  `rank` int(100) DEFAULT NULL,
  `hide` int(1) DEFAULT NULL,
  `template_id` int(32) unsigned DEFAULT NULL,
  `alias` varchar(255) DEFAULT NULL,
  `layout` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`menu_id`),
  KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

有谁知道为什么和如何修复它吗?问题是-同样的查询在我的本地机器上运行得很好,在我之前的主机上也运行得很好。顺便说一句,它来自一个成熟的项目- phpdevshell -所以我猜这些家伙知道他们在做什么,尽管你永远不会知道。

任何线索都很感谢。

我使用的是phpMyAdmin。

EN

回答 8

Stack Overflow用户

发布于 2012-01-06 01:50:30

此错误表示索引index的长度大于1000个字节。MySQL和存储引擎可能有此限制。我在MySQL 5.5上得到了类似的错误-‘指定的密钥太长;最大密钥长度是3072字节’,当运行这个脚本时:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS test_table1 (
  column1 varchar(500) NOT NULL,
  column2 varchar(500) NOT NULL,
  column3 varchar(500) NOT NULL,
  column4 varchar(500) NOT NULL,
  column5 varchar(500) NOT NULL,
  column6 varchar(500) NOT NULL,
  KEY `index` (column1, column2, column3, column4, column5, column6)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

UTF8为多字节,密钥长度计算方式为- 500 *3*6= 9000字节。

但请注意,下一个查询可以正常工作!

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS test_table1 (
  column1 varchar(500) NOT NULL,
  column2 varchar(500) NOT NULL,
  column3 varchar(500) NOT NULL,
  column4 varchar(500) NOT NULL,
  column5 varchar(500) NOT NULL,
  column6 varchar(500) NOT NULL,
  KEY `index` (column1, column2, column3, column4, column5, column6)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

...because我使用了CHARSET=latin1,在本例中,密钥长度为500 *6= 3000字节。

票数 34
EN

Stack Overflow用户

发布于 2014-04-05 03:49:32

在创建或更改表之前运行此查询。

SET @@global.innodb_large_prefix = 1;

这会将最大密钥长度设置为3072字节

票数 11
EN

Stack Overflow用户

发布于 2018-09-05 16:28:07

我也面临着同样的问题,使用下面的查询来解决它。

在创建DB时,您可以使用utf-8编码

例如:create database my_db character set utf8 collate utf8mb4;

编辑:(考虑来自评论的建议)将utf8_bin更改为utf8mb4

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8746207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档