首批通过分布式安全可靠测评,为关键业务系统打造
SQL 执行偶发报错 -4016 日志报错 obj1 and obj2 can't compare 的原因和解决方法
更新时间:2026-05-15 09:06
问题现象
用户有条 SQL 执行报错 ERROR 4016 (HY000): Internal error 展示计划 explain 也报错 -4016,日志报错 obj1 and obj2 can't compare,需要优先规避。
SELECT
*
FROM
TABLE_X
WHERE
(
url_id = '8edaaa93c0d942088400c01f4d6afed2'
AND upper(table_schema) = 'ZSM'
AND upper(table_name) = 'MALL_SYS_ACTIVITY'
AND unload_sql = "xxxxx" COLLATE utf8mb4_bin
);
SQL 中 unload_sql 为 text 类型。
关键信息
通关命令键词过滤日志信息
grep "obj1 and obj2 can't compare" observer.log*,日志中[errcode=-4016] obj1 and obj2 can't compare报错并且包含obj1={"TEXT" obj2={"TEXT"可以确定是此问题。[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"}) [2024-11-11 18:45:51.169638] WDIAG [SQL.OPT] get_bucket_bound_idx (ob_opt_selectivity.cpp:3601) [9763][T1024_L0_G0][T1024][xxxxx-xxxxx-xxxxx-xxxxx] [lt=14][errcode=-4016] failed to compare object(ret=-4016)SQL 中条件比较的字段为 text 类型。
问题原因
具体是优化器计算选择率时,使用了 obj_cast to_type 做了类型转换,然后调用比较函数,由于字符集不同,不能比较,导致报错。字符集不同原因是 BLOB 类型只设置了 type 类型,collation 没设置导致,如果在表结构定义了的 collation 与默认的 collation 不同就可能触发。
问题的风险及影响
SQL 执行报错 ERROR 4016 (HY000): Internal error。
适用版本
OceanBase 数据库 V4.x 版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.1 BP3(oceanbase-4.2.1.3-103000052023122809)及之后版本。
规避方式
规避方法指定字符集序规避,同表结构 unload_sql 定义字符集序相同规避:unload_sql = "xxxx" COLLATE utf8mb4_general_ci。
SELECT
*
FROM
TABLE_X
WHERE
(
url_id = '8edaaa93c0d942088400c01f4d6afed2'
AND upper(table_schema) = 'ZSM'
AND upper(table_name) = 'MALL_SYS_ACTIVITY'
AND unload_sql = "xxxxx" COLLATE utf8mb4_bin
);