首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库 V4.x 版本中字符集为 gbk 的 Oracle 模式租户下匿名块含 dbms_sql.parse 函数,执行时报错 ob_convert failed(ret=-4258 的原因和解决方法
更新时间:2026-05-19 08:21
问题现象
OceanBase 数据库 V4.x 版本中字符集为 gbk 的 Oracle 模式租户环境下,执行一个含 dbms_sql.parse 函数的匿名块,结果返回乱码,如下图所示。

关键日志信息如下。
[2024-09-27 13:31:55.601647] WDIAG [LIB.CHARSET] charset_convert (ob_charset.cpp:2963) [3922][T1008_L0_G0][T1008][xxxxx-xxxxx-xxxxx-xxxxx] [lt=1][errcode=-4258] ob_convert failed(ret=-4258, errors=6, from_type=46, to_type=87, from_charset="utf8mb4", to_charset="gbk", ObString(from_len, from_str)='����ƾ֤', to_len=20, from_str="data_size:10, data:27B4E6CDD0C6BED6A427")
[2024-09-27 13:31:55.601690] WDIAG [LIB.CHARSET] charset_convert (ob_charset.cpp:3032) [3922][T1008_L0_G0][T1008][xxxxx-xxxxx-xxxxx-xxxxx] [lt=43][errcode=-4258] convert charset failed(ret=-4258, in='����ƾ֤', src_cs_type=46, dst_cs_type=87, in.ptr()="data_size:10, data:27B4E6CDD0C6BED6A427")
问题原因
该问题为产品缺陷,gbk 字符集租户下系统包 dbms_sql.parse 是按 utf8 执行的,导致接收到 gbk 编码的 SQL 解析时出现乱码。
问题的风险及影响
执行结果乱码。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
适用版本
OceanBase 数据库 V4.x 版本。
解决方法及规避方式
解决方法:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.5(oceanbase-4.2.5.0-100000082024102022)版本。
规避方式:
在 OceanBase 数据库 V4.2.1.8 版本中复现,示例如下。
创建表与存储过程。

上述存储过程中存在
dbms_sql.column_value(vl_FormulaID,1,vc_out);输出报错。注释掉不执行存储过程中 dbms_sql.parse 解析。

上述存储过程中注释掉不执行
dbms_sql.column_value(vl_FormulaID,1,vc_out);正常输出。查看字符集。

gbk 字符集下,使用 EXECUTE IMMEDIATE 或者 open/fetch 的形式输出。