ERROR 1071 (42000) : 指定的密钥太长;最大密钥长度为 3072 字节

问题描述 投票:0回答:3

我一直在尝试将这个旧的 .sql 导入到:

Server version: 10.8.3-MariaDB
Server charset: UTF-8 Unicode (utf8mb4)
InnoDB

并且已经阅读了大量关于此错误的答案,但似乎无论我将 varchar 设置得有多低,我都会不断收到相同的错误。原来是:

CREATE TABLE nuke_cpg_pictures (
   pid int(11) NOT NULL auto_increment,
   aid int(11) DEFAULT '0' NOT NULL,
   filepath varchar(255) NOT NULL,
   filename varchar(255) NOT NULL,
   filesize int(11) DEFAULT '0' NOT NULL,
   total_filesize int(11) DEFAULT '0' NOT NULL,
   pwidth smallint(6) DEFAULT '0' NOT NULL,
   pheight smallint(6) DEFAULT '0' NOT NULL,
   hits int(10) DEFAULT '0' NOT NULL,
   mtime timestamp(14),
   ctime int(11) DEFAULT '0' NOT NULL,
   owner_id int(11) DEFAULT '0' NOT NULL,
   owner_name varchar(40) NOT NULL,
   pic_rating int(11) DEFAULT '0' NOT NULL,
   votes int(11) DEFAULT '0' NOT NULL,
   title varchar(255) NOT NULL,
   caption text NOT NULL,
   keywords varchar(255) NOT NULL,
   approved enum('YES','NO') DEFAULT 'NO' NOT NULL,
   user1 varchar(255) NOT NULL,
   user2 varchar(255) NOT NULL,
   user3 varchar(255) NOT NULL,
   user4 varchar(255) NOT NULL,
   url_prefix tinyint(4) DEFAULT '0' NOT NULL,
   randpos int(11) DEFAULT '0' NOT NULL,
   pic_raw_ip tinytext,
   pic_hdr_ip tinytext,
   PRIMARY KEY (pid),
   KEY pic_hits (hits),
   KEY pic_rate (pic_rating),
   KEY aid_approved (aid, approved),
   KEY randpos (randpos),
   KEY pic_aid (aid),
   KEY search (title, caption, keywords, filename)
);

目前位于:

CREATE TABLE nuke_cpg_pictures (
   pid int NOT NULL auto_increment,
   aid int DEFAULT '0' NOT NULL,
   filepath varchar(80) NOT NULL,
   filename varchar(50) NOT NULL,
   filesize int DEFAULT '0' NOT NULL,
   total_filesize int DEFAULT '0' NOT NULL,
   pwidth smallint(6) DEFAULT '0' NOT NULL,
   pheight smallint(6) DEFAULT '0' NOT NULL,
   hits int DEFAULT '0' NOT NULL,
   mtime timestamp(6),
   ctime int DEFAULT '0' NOT NULL,
   owner_id int DEFAULT '0' NOT NULL,
   owner_name varchar(40) NOT NULL,
   pic_rating int DEFAULT '0' NOT NULL,
   votes int( DEFAULT '0' NOT NULL,
   title varchar(100) NOT NULL,
   caption text NOT NULL,
   keywords varchar(50) NOT NULL,
   approved enum('YES','NO') DEFAULT 'NO' NOT NULL,
   user1 varchar(50) NOT NULL,
   user2 varchar(50) NOT NULL,
   user3 varchar(50) NOT NULL,
   user4 varchar(50) NOT NULL,
   url_prefix tinyint(4) DEFAULT '0' NOT NULL,
   randpos int DEFAULT '0' NOT NULL,
   pic_raw_ip tinytext,
   pic_hdr_ip tinytext,
   PRIMARY KEY (pid),
   KEY pic_hits (hits),
   KEY pic_rate (pic_rating),
   KEY aid_approved (aid, approved),
   KEY randpos (randpos),
   KEY pic_aid (aid),
   KEY search (title, caption, keywords, filename)
);

有人有什么想法吗?

mysql mariadb
3个回答
3
投票

声明为

TEXT
的列不能被索引。 您似乎不太可能从中受益

INDEX (title, caption, keywords, filename)

虽然您可能会受益于

FULLTEXT (title, caption, keywords, filename)

但这意味着用它来搜索:

WHERE MATCH (title, caption, keywords, filename)
         AGAINST ("...")

请参阅文档,了解可以在

AGAINST
子句中放入哪些内容。
FULLTEXT
非常适合在一列或多列(在您的情况下为 4 列)中搜索“单词”。
FULLTEXT
很乐意处理
TEXT
列;
INDEX
(又名
KEY
)不是。

至于使用“前缀”的建议(例如,

caption(100)
),你可能会发现它要么没有用,要么适得其反。

至于更改为

INDEX(title, keywords, filename)
,请向我们展示可能想要使用该索引的查询。 它可能不适用。

如果

caption
从来都不是很长,则更改为具有合适最大值的
VARCHAR
。 其他字符串也是如此。

如果您使用

CHARACTER SET utf8mb4
,您将无法在单个
VARCHAR(255)
中拥有 4 个
INDEX
- 它将达到 3072 的限制。 缩小大小,更改字符集,或者(可能是最好的)切换到全文。

请提供某种样本

SELECT

其他注意事项:

pic_raw_ip tinytext
-- 这是IP地址吗?
VARCHAR(39)
比较合适;
TINYTEXT
几乎总是不明智的。

url_prefix
听起来像一个字符串,但它被声明为
tinyint(4)
,其范围为 -128 ti +127。 给什么?

filesize int
-- 请注意,仅限 2GB;可能适合图片(这十年),但不适用于视频。


0
投票

就我而言,它可以按如下方式创建索引:

使用 BTREE ON 创建索引 user_meta_key db.user_postmeta (meta_key(255),meta_value(255));

如您所见,我将值放在括号中以将字段的值限制为 255,并且我没有使用长文本作为数据类型。 我希望这个解决方案可以帮助您,它对我有用。

注意:我的引擎是MariaDB


0
投票

添加具有唯一约束的列 text_md5 并将字符串的 md5() 放在那里(可以在插入触发器之前使用)。

© www.soinside.com 2019 - 2024. All rights reserved.