首批通过分布式安全可靠测评,为关键业务系统打造
Oracle 参数 max_string_size 引发的兼容性问题
更新时间:2026-05-18 09:11
问题现象
在 OceanBase 数据库的 Oracle 租户执行下述语句,对一个长度 2001 字节的字符先转为 raw 再求 hash 值的操作,返回超长的报错,然而相应的语句在 Oracle 可以正常执行。
obclient [SYS]> select dbms_crypto.hash(utl_raw.cast_to_raw(value),2) md5_val from (select lpad('a',2001,'a') value from dual);
ORA-06502: PL/SQL: numeric or value error: raw variable length too long
问题原因
对于 Oracle 来说,12C 版本之后就引进了 max_string_size 参数,如果将此参数的默认值 STANDARD 改为 EXTENDED 的话,字段类型 VARCHAR2、NVARCHAR2、RAW,均扩容到 32767。如不修改的话,RAW 的长度为 2000。
SQL> select dbms_crypto.hash(utl_raw.cast_to_raw(value),2) from (
select lpad('a',2001,'a') value from dual
);
DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(VALUE),2)
--------------------------------------------------------------------------------
92EF9E6254EF983ED822E8FEE32754A9
SQL> select dbms_crypto.hash(utl_raw.cast_to_raw(value),2) md5_val from (
select lpad('a',2001,'a') value from dual
); *
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: raw variable length too long
SQL> select dbms_crypto.hash(utl_raw.cast_to_raw(value),2) from (
select lpad('a',2001,'a') value from dual
);
ORA-06512: at "SYS.UTL_RAW", line 224
OceanBase 数据库在设计的时候,并没有采用类似 max_string_size 的设置,常用的 varchar2 的最大长度已经是 32767,这与 Oracle 的最大值是一致的。至于 RAW 值,则仍然为 2000,比将 max_string_size 设置为 EXTENED 的 Oracle 小,有兼容性风险。
适用版本
OceanBase V2.x、V3.x版本。
解决方法
目前 OceanBase 数据库侧并无解决方案,仅能修改应用程序。
对于本文档例子中的求 hash 值的语句,可以这么修改。
obclient [SYS]> select dbms_crypto.hash(to_clob(value),2) md5_new_val from (
-> select lpad('a',2001,'a') value from dual
-> );
+----------------------------------+
| MD5_NEW_VAL |
+----------------------------------+
| 92EF9E6254EF983ED822E8FEE32754A9 |
+----------------------------------+
1 row in set (0.044 sec)
需要特别说明的是,目前 OceanBase 数据库的 dbms_crypto 函数处理 clob 逻辑与 Oracle 并不完全一致,同样的文本,有一定概率返回不一样的值。