基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OceanBase 数据库带有空格和换行符的字符串处理和 Oracle 数据库不兼容
更新时间:2026-05-18 09:11
问题现象
如下场景的字符串中,在字符串 '123' 和换行符之间有很多空格,由于内核 trim 掉了字符串中的换行前空格导致长度变少,如下示例。
obclient> select length('123
'> 4') from dual;
+----------------+
| LENGTH('1234') |
+----------------+
| 5 |
+----------------+
1 row in set (0.00 sec)
上述行为预期的长度为:
OceanBase(TEST@TEST)>select length('123
'> 4') from dual;
+----------------+
| LENGTH('1234') |
+----------------+
| 23 |
+----------------+
1 row in set (0.001 sec)
关键诊断信息
触发条件
字符串中带有空格 + 换行符存在。
事前检查
该问题主要发生在字符串中,往往针对一些如 JSON 类型、LONGTEXT 类型,用户输入的字符串是按照换行格式。
事后诊断
该问题主要发生于 OMS 数据迁移过程中,数据校验一致性的时候会发现字符串的长度不一致。
问题原因
该问题出现的原因是移除换行前空格的行为是 Oracle 数据库的 SQLPLUS 客户端行为,示例如下:
SQL> select length('123
2 4') from dual;
LENGTH('1234')
--------------
5
但是 OceanBase 数据库内核之前误判认为是 Oracle 的内核行为,在 OceanBase 数据库的内核进行了兼容,从而导致出现该问题。
问题的风险及影响
会导致 OMS 数据迁移出现数据一致性问题及潜在的插入数据的正确性问题。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
影响版本
OceanBase 数据库企业版 V3.2.3 BP10(oceanbase-3.2.3.3-110000092023091219)及之后版本、V3.2.4 BP6(oceanbase-3.2.4.6-106000062023110109)及之后版本、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 BP8(oceanbase-3.2.4.8-108000142024041520)、V4.2.1 BP3 Hotfix4(oceanbase-4.2.1.3-103040012024011620)、V4.2.1 BP3 Hotfix5(oceanbase-4.2.1.3-103050012024012511)、V4.2.1 BP4(oceanbase-4.2.1.4-104000062024022914)。
可以考虑字符串使用拼接的方式,示例如下:
OceanBase(TEST@TEST)>select length('123 '||chr(10)||'4') from dual; +-----------------------------+ | LENGTH('123'||CHR(10)||'4') | +-----------------------------+ | 23 | +-----------------------------+ 1 row in set (0.002 sec)
规避方式
目前只能考虑修改输入字符串的形式,改为拼接的方式。