基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
全文索引创建失败 duplicated row 问题分析与解决
更新时间:2026-05-22 08:56
问题现象
简易验证,如下。
CREATE TABLE t2 ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, content TEXT NOT NULL, FULLTEXT (title, content) with parser beng ) DEFAULT charset utf8mb4 collate utf8mb4_unicode_ci;
INSERT INTO t2 (title, content) VALUES ('MySQL全文搜索简介', UNHEX('617474616368656400206174746163686564c2a0'));
如上问题报错 4016 或者创建全文索引时报 duplicated rows。
在创建全文索引的过程中,由于特定字符集下的空格判定逻辑不一致,导致分词后的数据在插入 SSTable 时被判定为主键重复,进而引发创建失败。具体表现为在使用 beng 分词器且字符集为 utf8mb4_unicode_ci 时,尝试插入包含特殊空格(如 C2A0)的文本字段 detail 时出现错误。
对于后建流程(先插入部分数据后,再创建全文索引),由于 DDL 过程中会有补数据,报错会在 DDL 过程中报出,这个场景里用户看到的是 duplicated primary key。 对于 DML 插入流程,会出现 4016 错误。
关键信息
错误码:
duplicated primary key // DDL。
4016 // DML。
字符集:
utf8mb4_unicode_ci。分词器:
beng。特殊空格字符:
C2A0。表结构示例:
主表:
incident。索引列:
detail。
问题原因
此问题是由于 OceanBase 内核中的一个 BUG 引起,具体表现为 MemTable 与外部容器使用的判等逻辑不一致,特别是在处理空格时,beng 分词器未能正确识别某些特殊空格字符(如 C2A0),导致同一行数据中的前缀加上特殊空格和仅前缀被视为重复值,从而触发错误码 4016。
问题的风险及影响
SQL 执行报错 4016 或创建索引 duplicated row 从而失败。
数据插入失败。
可能影响到依赖全文索引功能的应用程序的正常运行。
适用版本
OceanBase 数据库 V4.3.5 BP3(oceanbase-4.3.5.3-103000102025071821)及之后版本。
解决方法及规避方式
将字段的字符集 collation 设置为 utf8mb4_general_ci。