首批通过分布式安全可靠测评,为关键业务系统打造
SQL 执行或查看计划时报错 ERROR 4016 (HY000): Internal error,日志打印 obj1 and obj2 can't compare 的原因和解决方法
更新时间:2026-05-15 09:06
问题现象
select 执行偶发报错 ERROR 4016 (HY000): Internal error,explain 也同样报错 ERROR 4016 (HY000): Internal error。
关键信息
关键日志: obj1 and obj2 can't compare。
且表字段含有 text collate utf8mb4_bin 类型字段。
完整日志如下:
[2024-11-11 18:45:51.169623] WDIAG [COMMON] compare (ob_obj_compare.cpp:3906) [9763][T1024_L0_G0][T1024][xxxxx-xxxxx-xxxxx-xxxxx] [lt=10][errcode=-4016] obj1 and obj2 can't compare(obj1={"TEXT":"select objt_id,prdu_code,orig_date,expi_date,term_type,crnt_perd_fac_inrat,ajst_benm,ajst_quot,op_date,op_mode from GDS_D_IT.D_P", collation:"utf8mb4_bin", coercibility:"IMPLICIT"}, obj2={"TEXT":"SELECT TITLE AS suggest , TITLE AS name , AC_DESC AS ACTIVE_TOPIC , REPLACE(b.name , '链接' , '') AS TYPE , STARTDATE , ENDDATE , ", collation:"invalid_type", coercibility:"IMPLICIT"}, obj1.get_meta()={type:"TEXT", collation:"utf8mb4_bin", coercibility:"IMPLICIT"}, obj2.get_meta()={type:"TEXT", collation:"invalid_type", coercibility:"IMPLICIT"})
问题原因
表结构中含有 text 类型字段且定义为 collate utf8mb4_bin,此字段与 string 类型比较时,判断 string 类型字符序和表字段定义字符集的序不一致,unload_sql text 指定为 utf8mb4_bin "xxxxx" 的字符序因为缺陷而没推导成功,化器计算选择率时,由于字符集不同不能比较,导致报错。
问题的风险及影响
SQL 频繁执行失败。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V4.2.1 BP10(oceanbase-4.2.1.10-110000072024111216)及之前版本。
解决方法及规避方式
解决方法:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.1 BP10 Hotfix1(oceanbase-4.2.1.10-110010022024112620)及之后版本。
规避方式:
在 SQL 的 text 类型比较条件前添加
collate utf8mb4_bin,如下。select * from t1 where t1.sql_text COLLATE utf8mb4_general_ci = "abc";