【问题标题】:MySQL error: Specified key was too long; max key length is 1000 bytesMySQL 错误:指定的键太长;最大密钥长度为 1000 字节
【发布时间】:2011-06-25 20:21:37
【问题描述】:

还有一些关于此错误的其他问题,但我很难理解这个问题。

我正在尝试制作一个非常基本的 MySQL 表。我正在尝试将所有内容都保存在 utf8 中,我确实理解它比普通字符集占用更多字节。

CREATE TABLE `bibliography` (
  `id` int(5) unsigned zerofill NOT NULL,
  `pub_type` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pub_genre` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `author_first` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `author_last` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `publication` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pub_date` date NOT NULL,
  `pub_city` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pub_country` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `html` text NOT NULL,
  `live` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `pub_type` (`pub_type`,`pub_genre`,`title`,`author_first`,`author_last`,`publication`,`pub_date`,`pub_city`,`pub_country`),
  KEY `live` (`live`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

好的,以上工作,但显然我不能活 5 个字符作者姓名。当我尝试提高限制时:

ALTER TABLE `bibliography` CHANGE `author_first` `author_first` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL 

我得到错误:

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

所以,我不明白。 1000 字节的限制是否适用于整个表?显然是的,对吧?

根据答案,有人可以告诉我设置索引之间的区别,例如:

KEY `live` (`live`),
  KEY `pub_type` (`pub_type`),
  KEY `pub_genre` (`pub_genre`),
  KEY `author_last` (`author_last`),
  KEY `publication` (`publication`) 

喜欢:

KEY `pub_type` (`pub_type`,`pub_genre`,`title`,`author_first`,`author_last`,`publication`,`pub_date`,`pub_city`)

我在这里开始明白,KEY 限制为 1000 个字节。但是你可以在一个表中有多个键。如何将一堆字段组合成一个键不同的形式为每个不同的字段分配一个键?

【问题讨论】:

  • 这个问题的答案已经给here了。

标签: mysql phpmyadmin key


【解决方案1】:

不,它不适用于整个表格。但是,您使用的 unicode 字段每个字符需要最多 3 个字节,因此包含 VARCHAR(50) unicode 字段的键在 MySQL 中转换为 150 个字节。所以,你的总数是:

KEY `pub_type` (
    `pub_type`, 5
    `pub_genre`, 5
    `title`, 255
    `author_first`, 5
    `author_last`, 5
    `publication`, 5
    `pub_date`, 3 bytes
    `pub_city`, 5
    `pub_country`5 
)

= 7*5 + 255 = 290 * 3 = 870 + 3 = 873 bytes。 您只有 1000 - 873 = 127 字节要扩展,这意味着您可以通过更多字符来扩展字段。不是一个安全的赌注。

您使用的索引(键)错误。在每个字段上都有索引是没有意义的。如果您想加快查询速度,请仅包含WHERE 子句中最常用的字段。

【讨论】:

    【解决方案2】:

    将您的 pub_type 键更改为仅包含 pub_type、pub_genre 和 title。奇怪的是,这个键几乎与您当前的键一样好,可以加快查询速度,并且可以让您拥有较长的作者姓名等,而不会违反表的最大键长度限制。

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2012-08-04
      • 2012-05-25
      • 2017-03-13
      • 1970-01-01
      • 2010-11-05
      • 2011-09-03
      • 2012-02-03
      相关资源
      最近更新 更多