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

ctzwtxfj  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(171)

我一直在尝试将这个旧的.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)
);

有什么想法吗?

oknrviil

oknrviil1#

没有声明为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,您将无法在一个INDEX中包含4个VARCHAR(255)--它将达到3072的限制。请缩小大小,更改字符集,或者(可能是最好的)切换到FULLTEXT。
请提供某种样品SELECT
其他注意事项:
pic_raw_ip tinytext--这是IP地址吗?VARCHAR(39)更合适; TINYTEXT几乎总是不明智的。
url_prefix听起来像一个字符串,但它被声明为tinyint(4),其范围为-128 ti +127。
filesize int--请注意,该大小限制为2GB;可能适合图片(这十年),但不适合视频。

相关问题