Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AL32UTF8中的Oracle LPAD/RPAD函数问题_Oracle - Fatal编程技术网

AL32UTF8中的Oracle LPAD/RPAD函数问题

AL32UTF8中的Oracle LPAD/RPAD函数问题,oracle,Oracle,NLS_字符集在我的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

NLS_字符集在我的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的方式?

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

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


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

解决办法

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

“它应该返回”甲骨文$$$$$$$“:参数n是显示在终端屏幕上的返回值的总长度。如果尝试
RPAD(CAST('s),会有什么不同吗?”甲骨文' 如nvarhar2(10)),10,“$”),RPAD(CAST('甲骨文' 正如VARCHAR2(10)),10,“$”)
?这不是“的情况”甲骨文$$$$$$$“,'因为AL32UTF8是多字节字符集。您提供的方法返回的结果与我上面发布的结果相同。如果您将显式的“N”放在文本前面:N'甲骨文'大家好,我通过谷歌搜索找到了原因和解决办法。下面是Oracle文档中的解释:“返回值在终端屏幕上显示的总长度。在大多数字符集中,这也是返回值中的字符数。但是,在某些多字节字符集中,字符串的显示长度可能与字符串中的字符数不同。“解决方法取决于屏幕中的实际显示长度(以单间距字体查看文本)解决方法:1)选择RPAD('甲骨文', 10-长度('甲骨文'), '$') 从DUAL;2)选择SUBSTRB('甲骨文' || RPAD(“$”,10,“$”),1,10)从双;