无法使用 InnoDB 在 MySQL 中的 VARCHAR 列上创建 FULLTEXT 索引

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

我使用的是 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):“标题”列不能成为全文索引的一部分

首先我查了一下我可能做错了什么。我发现了这些可能的问题原因:

  1. 数据类型错误

  2. 列长度太长

  3. 存储引擎不支持FULLTEXT索引

  4. ‘title’这个词是我的MySQL的保留字

  5. 我有语法错误

现在,我可以就这些可能的原因说几句话。数据类型是正确的,我查了一下,它说我可以使用 TEXT、CHAR 和 VARCHAR 数据类型。列长度也应该没问题,我使用的是 InnoDB,为此,FULLTEXT 索引的最大列长度应该是 767 字节。 190 个字符的 VARCHAR 不能超过 767 个字节。我听说 InnoDB 支持 FULLTEXT 索引,所以这应该不是问题。最后两个原因是不可能的,我测试过,但对我来说似乎很荒谬。

我尝试使用 SQL Manager 和语句创建索引,但这些都不起作用:

ALTER TABLE media ADD FULLTEXT INDEX MEDIA_TITLE_FULLTEXT (title);

我已经没有主意了,我已经花了大约 10 个小时在互联网上搜索解决方案

sql mysql indexing full-text-search innodb
1个回答
0
投票

放弃utf16;使用utf8mb4。

ALTER TABLE media CONVERT TO utf8mb4 COLLATE utf8mb4_0900_ai_ci;

如果您的客户端使用 utf16,请务必在连接参数中使用 utf16 或在连接后立即调用

SET NAMES utf16;

FULLTEXT
支持任何长度
VARCHAR
TEXT
/
MEDIUMTEXT
/等。 197 等与这里无关。

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