我使用的是 MySQL 8,我有下表:
CREATE TABLE `media` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`media_code` VARCHAR(50) COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`systematic` VARCHAR(20) COLLATE utf16_general_ci NOT NULL,
`title` VARCHAR(190) COLLATE utf16_general_ci DEFAULT NULL,
`authors` VARCHAR(200) COLLATE utf16_general_ci DEFAULT NULL,
`media_type` ENUM('book','cd','dvd') COLLATE utf16_general_ci DEFAULT NULL,
`physical_format` VARCHAR(50) COLLATE utf16_general_ci DEFAULT NULL,
`topic` VARCHAR(100) COLLATE utf16_general_ci DEFAULT NULL,
`languages` VARCHAR(20) COLLATE utf16_general_ci DEFAULT NULL,
`count_pages` INTEGER DEFAULT NULL,
`publisher` VARCHAR(100) COLLATE utf16_general_ci DEFAULT NULL,
`publisher_loc` VARCHAR(100) COLLATE utf16_general_ci DEFAULT NULL,
`publication_year` SMALLINT DEFAULT NULL,
`publication_edition` SMALLINT DEFAULT NULL,
`isbn_old` VARCHAR(40) COLLATE utf16_general_ci DEFAULT NULL,
`isbn` VARCHAR(20) COLLATE utf16_general_ci DEFAULT NULL,
`imported` SMALLINT NOT NULL DEFAULT 0,
`is_borrowed` TINYINT NOT NULL DEFAULT 0,
`is_active` TINYINT NOT NULL DEFAULT 1,
`external_source` VARCHAR(20) COLLATE utf16_general_ci DEFAULT NULL,
`external_id` VARCHAR(20) COLLATE utf16_general_ci DEFAULT NULL,
PRIMARY KEY USING BTREE (`id`)
) ENGINE=InnoDB
AUTO_INCREMENT=4513 ROW_FORMAT=DYNAMIC CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci';
我想在“title”列上创建全文索引,但我总是收到以下错误:
错误 1283 (HY000):“标题”列不能成为全文索引的一部分
首先我查了一下我可能做错了什么。我发现了这些可能的问题原因:
数据类型错误
列长度太长
存储引擎不支持FULLTEXT索引
‘title’这个词是我的MySQL的保留字
我有语法错误
现在,我可以就这些可能的原因说几句话。数据类型是正确的,我查了一下,它说我可以使用 TEXT、CHAR 和 VARCHAR 数据类型。列长度也应该没问题,我使用的是 InnoDB,为此,FULLTEXT 索引的最大列长度应该是 767 字节。 190 个字符的 VARCHAR 不能超过 767 个字节。我听说 InnoDB 支持 FULLTEXT 索引,所以这应该不是问题。最后两个原因是不可能的,我测试过,但对我来说似乎很荒谬。
我尝试使用 SQL Manager 和语句创建索引,但这些都不起作用:
ALTER TABLE media ADD FULLTEXT INDEX MEDIA_TITLE_FULLTEXT (title);
我已经没有主意了,我已经花了大约 10 个小时在互联网上搜索解决方案
放弃utf16;使用utf8mb4。
ALTER TABLE media CONVERT TO utf8mb4 COLLATE utf8mb4_0900_ai_ci;
如果您的客户端使用 utf16,请务必在连接参数中使用 utf16 或在连接后立即调用
SET NAMES utf16;
。
FULLTEXT
支持任何长度VARCHAR
或TEXT
/MEDIUMTEXT
/等。 197 等与这里无关。