AL32UTF8中的Oracle LPAD/RPAD函数问题

eli*_*uhy 6 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> 
Run Code Online (Sandbox Code Playgroud)

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

我的问题是为什么RPAD功能不像lengthb那样?

eli*_*uhy 1

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

\n\n
\n

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

\n
\n\n

解决方法

\n\n
-- 1) \nSELECT RPAD(\'\xe7\x94\xb2\xe9\xaa\xa8\xe6\x96\x87\', 10 - LENGTHC(\'\xe7\x94\xb2\xe9\xaa\xa8\xe6\x96\x87\'), \'$\') FROM DUAL; \n-- 2) Recomended!\nSELECT SUBSTRB(\'\xe7\x94\xb2\xe9\xaa\xa8\xe6\x96\x87\' || RPAD(\'$\', 10, \'$\'), 1, 10) FROM DUAL;\n
Run Code Online (Sandbox Code Playgroud)\n