AL32UTF8中的Oracle LPAD / RPAD函数问题

时间:2013-11-27 11:23:49

标签: oracle

我的Oracle数据库中的NLS_CHARACTERSET是AL23UTF8。 使用RPAD功能时遇到问题:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
Connected as apps@UATSED

SQL> 
SQL> SELECT '甲骨文' ORACLE, LENGTHB('甲骨文') ORACLE_LENGTH,
  2         RPAD('甲骨文', 10, '$') ORA_RPAD, LENGTHB(RPAD('甲骨文', 10, '$')) ORA_RPAD_LENGTH
  3    FROM dual
  4  ;

ORACLE    ORACLE_LENGTH ORA_RPAD      ORA_RPAD_LENGTH
--------- ------------- ------------- ---------------
甲骨文                9 甲骨文$$$$                 13

SQL> 

我们知道一个汉字在AL32UTF8编码方法中占用3个字节。 因此,在我的示例中,lengthb函数返回正确的结果。 但我们使用RPAD函数用$填充更多空格,一个汉字需要2个字节,而不是3个字节。因此,当我总共填充10个字节时,它为我填充了4个$符号。

我的问题是为什么RPAD功能不像长度一样?

2 个答案:

答案 0 :(得分:1)

根据@jonearles的要求,我在评论部分将我的解决方案复制为单一答案,以帮助人们解决这个问题。

  

大家好,我通过Google搜索了解原因和解决方法。以下是Oracle文档中的说明:“终端屏幕上显示的返回值的总长度。在大多数字符集中,这也是返回值中的字符数。但是,在某些多字节字符集中,字符串的显示长度可以与字符串中的字符数不同。“解决方法取决于屏幕中的实际显示长度(以等宽字体查看文本)

<强>变通方法

-- 1) 
SELECT RPAD('甲骨文', 10 - LENGTHC('甲骨文'), '$') FROM DUAL; 
-- 2) Recomended!
SELECT SUBSTRB('甲骨文' || RPAD('$', 10, '$'), 1, 10) FROM DUAL;

答案 1 :(得分:0)

这是Oracle的错误。错误的原因是: 每个$是一个字节,但每个中文字符是3个字节。当这个版本的RPAD工作时,他只计算3个中文+ 10 $'= 13个字节。当他显示13个字节时 - 他必须削减一些$。您欢迎使用Oracle打开错误。