You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle含非英文字符赋值触发ORA-06502错误的问题求助

ORA-06502错误:substr返回长度10但赋值失败的原因与解决方法

问题根源

Oracle里varchar2(10)默认限制的是字节数,而length()函数统计的是字符个数。你的示例中Ñ是多字节字符(UTF-8编码下占2字节),substr('JOHÑ NEWMAN',1,10)截取的是10个字符,但实际占用的字节数是11,超过了userName变量的字节限制,所以触发了ORA-06502错误。

解决办法

方法1:指定变量按字符长度限制

把变量定义改为varchar2(10 CHAR),这样限制的是10个字符,不管每个字符占多少字节,就能正常容纳截取后的内容:

declare
  userName varchar2(10 CHAR); -- 明确按字符数限制长度
begin
  dbms_output.put_line('字符数: ' || length(substr('JOHÑ NEWMAN',1,10)));
  userName := substr('JOHÑ NEWMAN',1,10);
  dbms_output.put_line('赋值结果: ' || userName);
end;

方法2:按字节数截取内容

如果业务需要严格限制字节数,改用substrb函数按字节截取前10字节(注意:这种方式可能截断多字节字符,导致乱码,需根据场景选择):

declare
  userName varchar2(10);
begin
  dbms_output.put_line('字节数: ' || lengthb(substrb('JOHÑ NEWMAN',1,10)));
  userName := substrb('JOHÑ NEWMAN',1,10);
  dbms_output.put_line('赋值结果: ' || userName);
end;

核心知识点

  • length():返回字符串的字符个数,lengthb():返回字符串的字节数
  • substr():按字符数截取字符串,substrb():按字节数截取字符串
  • varchar2(n)默认是字节长度限制,varchar2(n CHAR)是字符长度限制

内容的提问来源于stack exchange,提问作者Chandra Sekhar kommuri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:24:16