基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
4.3.5.3 升级至 4.4.2 后查询 all_tab_columns 系统视图结果顺序不一致
更新时间:2026-08-21 07:36
问题现象
客户从 OceanBase 4.3.5.3 版本升级到 4.4.2.1 版本后,对 all_tab_columns 系统视图进行查询,并按照 table_name 和 column_name 排序,发现 column_name 列的排序结果在两个版本中存在差异。客户租户的字符集为 GBK。
问题原因
该现象源于 OceanBase 4.4.2 版本对系统视图 Collation 推导逻辑的架构优化。
all_tab_columns视图底层基于ALL_TAB_COLS_V$构建,其中column_name字段的定义为:CAST(TC.COLUMN_NAME AS VARCHAR2(128) IGNORE) AS COLUMN_NAME。- 4.3.5.3 版本行为:表达式类型推导默认调用
get_nls_collation()函数,即根据租户的 NLS 字符集(例如 GBK)推导 Collation。这导致CAST操作输出的COLUMN_NAME列继承了 GBK 排序规则,最终结果按 GBK 规则排序。 - 4.4.2 版本行为:由于 OceanBase 数据字典的排序规则统一为 UTF-8,在之前的版本中,非 UTF-8 字符集的租户查询系统表或视图时可能无法使用索引。4.4.2 版本对此进行了优化,新增了对
CM_IS_ORA_SYS_VIEW_CAST的判断机制。当检测到系统视图中的CAST操作时,会强制使用源数据的 Collation(即 UTF-8)。因此,CAST输出的列改为 UTF-8 排序规则,按 UTF-8 字节序排序,从而引发了排序结果的差异。
关键信息
4.3.5.3 版本查询结果
obclient [SYS]> SELECT table_name, column_name, data_type, data_length, nullable FROM all_tab_columns t WHERE t.TABLE_NAME = 'REPORT_ORDER_DETAIL' ORDER BY table_name, column_name;
+---------------------+--------------------+-----------+-------------+----------+
| TABLE_NAME | COLUMN_NAME | DATA_TYPE | DATA_LENGTH | NULLABLE |
+---------------------+--------------------+-----------+-------------+----------+
| REPORT_ORDER_DETAIL | EQD下单时间 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 订单状态 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 对冲资金账号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 更新时间 | DATE | 7 | Y |
| REPORT_ORDER_DETAIL | 合约编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易代码 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易方向 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易类型 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易日期 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 内部编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 市场 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 收益互换客户 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 算法类型 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 算法下单时间 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 算法子单编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 提示信息 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 下单价格 | NUMBER | 22 | Y |
| REPORT_ORDER_DETAIL | 下单数量 | NUMBER | 22 | Y |
| REPORT_ORDER_DETAIL | 下游编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 账户 | VARCHAR2 | 255 | Y |
+---------------------+--------------------+-----------+-------------+----------+
20 rows in set (0.357 sec)
4.4.2.1 版本查询结果
obclient [SYS]> SELECT table_name, column_name, data_type, data_length, nullable FROM all_tab_columns t WHERE t.TABLE_NAME = 'REPORT_ORDER_DETAIL' ORDER BY table_name, column_name;
+---------------------+--------------------+-----------+-------------+----------+
| TABLE_NAME | COLUMN_NAME | DATA_TYPE | DATA_LENGTH | NULLABLE |
+---------------------+--------------------+-----------+-------------+----------+
| REPORT_ORDER_DETAIL | EQD下单时间 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 下单价格 | NUMBER | 22 | Y |
| REPORT_ORDER_DETAIL | 下单数量 | NUMBER | 22 | Y |
| REPORT_ORDER_DETAIL | 下游编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易代码 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易方向 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易日期 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 交易类型 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 内部编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 合约编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 对冲资金账号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 市场 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 提示信息 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 收益互换客户 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 更新时间 | DATE | 7 | Y |
| REPORT_ORDER_DETAIL | 算法下单时间 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 算法子单编号 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 算法类型 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 订单状态 | VARCHAR2 | 255 | Y |
| REPORT_ORDER_DETAIL | 账户 | VARCHAR2 | 255 | Y |
+---------------------+--------------------+-----------+-------------+----------+
20 rows in set (1.729 sec)
问题的风险及影响
升级后,对 all_tab_columns 系统视图执行相同的查询,返回结果的顺序可能不一致。
影响租户
Oracle 模式租户(GBK 字符集)。
适用版本
OceanBase 4.3.5 BP5(oceanbase-4.3.5.5-105000212025111617)和 4.4.2(oceanbase-4.4.2.0-100000252026020915) 及之后版本。
解决方法
暂无。
规避方式
暂无。