dgi*_*gig 4 mysql key phpmyadmin
关于这个错误还有一些其他问题,但是我很难解决这个问题.
我正在尝试制作一个非常基本的MySQL表.我试图在utf8中保留每一个东西,我理解它比普通的char集需要更多的字节.
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;
Run Code Online (Sandbox Code Playgroud)
好的,所以上面的工作,但显然我不能生活5个字符的作者名称.当我试图提高限额时:
ALTER TABLE `bibliography` CHANGE `author_first` `author_first` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
Run Code Online (Sandbox Code Playgroud)
我收到错误:
1071 - 指定密钥太长; 最大密钥长度为1000字节
所以,我不明白.1000字节限制是否适用于整个表格?显然它确实如此,对吧?
根据答案,有人可以启发我建立索引之间的区别,如:
KEY `live` (`live`),
KEY `pub_type` (`pub_type`),
KEY `pub_genre` (`pub_genre`),
KEY `author_last` (`author_last`),
KEY `publication` (`publication`)
Run Code Online (Sandbox Code Playgroud)
并喜欢:
KEY `pub_type` (`pub_type`,`pub_genre`,`title`,`author_first`,`author_last`,`publication`,`pub_date`,`pub_city`)
Run Code Online (Sandbox Code Playgroud)
我开始在这里理解,KEY限制为1000字节.但是你可以在表格中有多个键.如何将一堆字段组合成一个不同的密钥形式,为每个不同的字段分配密钥?
不,它不适用于整个表格.但是,您正在使用每个字符最多需要 3个字节的unicode字段,因此包含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
)
Run Code Online (Sandbox Code Playgroud)
= 7*5 + 255 = 290 * 3 = 870 + 3 = 873 bytes.您只需要1000 - 873 = 127扩展字节,这可以转换为127 / 3 = 42您可以扩展字段的更多字符.不是一个安全的赌注.
您使用索引(键)错误.每个领域都有一个索引是没有意义的.如果您正在尝试加快查询速度,请仅包含WHERE子句中最常使用的字段.