MySQL 错误 : Specified key was too long; max key length is 1000 bytes

标签 mysql phpmyadmin key

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

我正在尝试制作一个非常基本的 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 - Specified key was too long; max key length is 1000 bytes

所以,我不明白。 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 个字节。但是你可以在一个表中有多个键。如何将一堆字段组合成一个键,不同的形式为每个不同的字段分配一个键?

最佳答案

不,它不适用于整个表格。但是,您使用的 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 字节。 您只有 1000 - 873 = 127 字节可以扩展,这意味着您可以扩展字段的字符数约为 127/3 = 42。不是一个安全的赌注。

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

关于MySQL 错误 : Specified key was too long; max key length is 1000 bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4974292/

相关文章:

python - 日期对象只有年和月

php - 如何将行从一个表复制到另一个表?

Mysql 关于重复键更新 - 如何使其不插入新行?

mysql - Laravel 如何将多个复选框值保存到 SQL 数据库的不同行中?

php - 数据库<select>标签的多重选择

mysql - 授予root权限后就无法登录了?

mysql - 从作为服务器的 phpmyadmin 转移到作为服务器的谷歌云平台?

python - 如何在 python 字典中追加键的值?

java - 如何在指定索引处插入值?

时间:2019-05-17 标签:c#mySQLcountresults