gpt4 book ai didi

AL32UTF8 中的 Oracle LPAD/RPAD 函数问题

转载 作者:行者123 更新时间:2023-12-04 15:58:32 26 4
gpt4 key购买 nike

NLS_CHARACTERSET 在我的 Oracle 数据库中是 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 函数不像 lengthb 那样遵循?

最佳答案

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

Hi guys, I've got the reason and workarounds by searching from Google. Here is the explanation from Oracle documentation: "The total length of the return value as it is displayed on your terminal screen. In most character sets, this is also the number of characters in the return value. However, in some multibyte character sets, the display length of a character string can differ from the number of characters in the string." And workarounds depend on the actual display length in your screen (View text in monospaced fonts)



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

关于AL32UTF8 中的 Oracle LPAD/RPAD 函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20241137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com