首批通过分布式安全可靠测评,为关键业务系统打造
字符串中含有非可见的 ASCII 字符时,LPAD 结果与 Oracle 不兼容
更新时间:2026-05-19 08:21
问题现象
字符串中含有非可见的 ASCII 字符时,LPAD 结果与 Oracle 不兼容,LPAD 结果比 Oracle 长。
OceanBase 数据库 Oracle 模式示例
创建表
t1。create table t1(c1 varchar2(100));插入带有 ASCII 数据。
insert into t1 values(unistr('\0003'));查询 LPAD 结果。
select lengthb(lpad(c1, '10', ' ')) - lengthb(c1), length(c1) from t1 ; +---------------------------------------+------------+ | LENGTHB(LPAD(C1,'10',''))-LENGTHB(C1) | LENGTH(C1) | +---------------------------------------+------------+ | 10 | 1 | +---------------------------------------+------------+ 1 row in set
Oracle 数据库示例
创建表
t1。create table t1(c1 varchar2(100));插入带有 ASCII 数据。
insert into t1 values(unistr('\0003'));查询 LPAD 结果。
select lengthb(lpad(c1, '10', ' ')) - lengthb(c1), length(c1) from t1 ; +---------------------------------------+------------+ | LENGTHB(LPAD(C1,'10',''))-LENGTHB(C1) | LENGTH(C1) | +---------------------------------------+------------+ | 9 | 1 | +---------------------------------------+------------+ 1 row in set
问题原因
LPAD 在计算非可见的 ASCII 字符的展示宽度时与 Oracle 算的结果不一致导致。
问题的风险及影响
LPAD 结果错误,多了一些字节。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响的版本
OceanBase 数据库企业版 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP15(oceanbase-2.2.77-115000012023010607)及之后版本、V3.1.2 BP11(oceanbase-3.1.2-111000052023010412)及之后版本、V3.2.3 BP6 Hotfix4(oceanbase-3.2.3.3-106040022022122222)版本、V3.2.3 BP6 Hotfix5(oceanbase-3.2.3.3-106050012023051617)版本、V3.2.3 BP7(oceanbase-3.2.3.3-107000092023011911)及之后版本。