---
title: ps cursor 和并行 encoding 场景下出现乱码问题-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于ps cursor 和并行 encoding 场景下出现乱码问题相关的常见问题和使用技巧，帮助您快速解决ps cursor 和并行 encoding 场景下出现乱码问题的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

划线反馈

# ps cursor 和并行 encoding 场景下出现乱码问题

更新时间：2026-05-29 08:46

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

## 问题现象

结果集显示乱码。

## 关键诊断信息

以下两种可能触发本文档中描述的乱码现象。

1. 使用 JDBC V2.2.6 及以下的版本与 JDBC V2.2.6 以上的版本，设置 `useServerPrepStmts=true` 混跑。
 2. 使用 JDBC V2.2.6 及以下版本，如果先仅设置 `useServerPrepStmts=true` 开启 PS 协议执行语句再设置 `useServerPrepStmts=true&useCursorFetch=true&defaultFetchSize>0` 开启 PS cursor 执行同一条语句。

可以通过以下方式判断是否为本文档中涉及的问题。

1. 判断是否使用了 ps cursor。
 2. 查看 SQL 的执行计划，如果 PX 算子出现在了顶层，就会产生并行 encoding 优化。
 3. 业务使用中出现不同 JDBC 版本混跑，或者使用了 V2.2.6 及之下的 JDBC 先用 PS 执行，再用 PS cursor 执行。
 4. 如果出现 1&2&3 且发生了乱码，则可以怀疑出现本文档中的问题。

## 问题原因

1. 并行 encoding 功能会在新引擎和非 inner session 的场景下设置 packed 标记，避免已经并行 encoding 过的数据在协议层重新 encode。
 2. ps cursor (非流式游标) 会在 open 阶段拉取结果集到本地，在 fetch 阶段基于本地结果集回包，拉取结果集时未保存物理计划上的 packed 标记，也就是未记录结果集是否 encoding，回包时会对已经 encoding 的数据二次 encode，导致回包结果错误。
 3. 对于 V2.2.6 及以下版本的 JDBC，开启 `useServerPrepStmts=true` 参数默认会走到 ps 协议，非游标，此时的计划是新引擎 + 非 inner session 的场景，有可能生成并行 encoding 的计划。
 4. 对于 V2.2.6 以上的 JDBC 版本，开启 `useServerPrepStmts=true` 参数会默认走到 ps cursor 协议，如果此时计划命中了第 3 条中生成的带 packed 标记的并行 encoding 计划，就会触发问题 2。

   **备注：**

      1. 此问题同样可以使用 V2.2.6 及以下版本的 JDBC 进行复现，具体为：

        a. 同一个 SQL 语句，先设置 `useServerPrepStmts=true` 参数走 ps 协议生成带 pack 的执行计划。

        b. 再设置 `useCursorFetch=true&useServerPrepStmts=true&defaultFetchSize=20` 参数走 ps cursor 复用带 pack 的执行计划。

        c. 与实际场景的不同点是需要通过手动修改驱动参数走 ps cursor 执行路径。
      2. 单纯的 ps cursor 模式不会触发问题，因为 ps cursor 路径会标记 inner session，无法生成并行 encoding 计划。
      3. JDBC V2.2.7 版本开始，所有 ps 下的查询会统一走 ps cursor，没有开关控制。V2.4.7 开始会引入新的开关，用户可以关闭这个默认路径。

## 问题的风险及影响

触发上述问题后，返回的结果集会乱码或者数据不正确。

## 影响租户

影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户，对于 SYS 租户无影响。

## 影响版本

OceanBase 数据库 V3.2.3 BP9（oceanbase-3.2.3.3-109000182023071410）及之后版本、V3.2.4 BP5（oceanbase-3.2.4.5-105000012023081513）及之后版本、V4.1.0 GA（oceanbase-4.1.0.0-100001122023040322）及之后版本、V4.2.1 GA（oceanbase-4.2.1.0-100000182023092722）及之后版本。

## 解决方法

- 内核修复。

  升级到问题已修复版本，目前已修复的版本包含 OceanBase 数据库 V3.2.3 BP11（oceanbase-3.2.3.3-111000032024070822）、V3.2.4 BP7（oceanbase-3.2.4.7-107000012023113010）、V4.2.1 BP2（oceanbase-4.2.1.2-102010012023120119）。
 - 业务如果撞到此问题。

     - 条件允许，统一业务驱动版本，避免多驱动版本混跑。
     - 如果无法改变混跑情况，可以尝试通过修改计划，避免出现 encoding 优化。可以创建全局索引，不让 PX 算子出现在顶层。

## 规避方式

避免 JDBC V2.2.6 及以下的版本与 JDBC V2.2.6 以上的版本设置 `useServerPrepStmts=true` 混跑。

Previous

[OceanBase 数据库 V4.x 版本中 PL insert clog 字段报错 PLS-00172: string literal too long 的原因和解决方法](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002398464)

Next

[OceanBase 数据库 V4.x 版本中执行 PL 时在操作 UTL_FILE 过程中出现 -4200，hash map/set entry exist 异常](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002393087) ![有帮助](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) 咨询热线
