---
title: "SQL 执行偶发报错 -4016 日志报错 obj1 and obj2 can&#x27;t compare 的原因和解决方法-OceanBase数据库使用指南"
description: "了解OceanBase数据库在实际应用中关于 SQL 执行偶发报错 -4016 日志报错 obj1 and obj2 can&#x27;t compare 的原因和解决方法相关的常见问题和使用技巧，帮助您快速解决 SQL 执行偶发报错 -4016 日志报错 obj1 and obj2 can&#x27;t compare 的原因和解决方法的难题。"
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# SQL 执行偶发报错 -4016 日志报错 obj1 and obj2 can't compare 的原因和解决方法

更新时间：2026-05-15 09:06

适用版本： V4.1.x、V4.2.x、V4.3.x 内容类型：Troubleshoot  

## 问题现象

用户有条 SQL 执行报错 `ERROR 4016 (HY000): Internal error` 展示计划 explain 也报错 -4016，日志报错 `obj1 and obj2 can't compare`，需要优先规避。

```shell
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 类型。

## 关键信息

1. 通关命令键词过滤日志信息 `grep "obj1 and obj2 can't compare" observer.log*`，日志中 `[errcode=-4016] obj1 and obj2 can't compare` 报错并且包含 `obj1={"TEXT" obj2={"TEXT"` 可以确定是此问题。

   ```shell
   [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)

   ```
 2. 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`。

```

上一篇

[IN 优化引入的正确性问题二](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002081861)

下一篇

[NLJ batch rescan，右支 tsc 子算子需要逆序排序，结果错误的原因和解决方法](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002396554) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
