NLS_CHARACTERSET - это AL23UTF8 в моей базе данных Oracle. У меня проблема при использовании функции RPAD:Проблема функции Oracle LPAD/RPAD в AL32UTF8
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
Connected as [email protected]
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>
Мы знаем, что китайский иероглиф принимает 3 байта в методе кодирования AL32UTF8. Поэтому в моем примере функция lengthb возвращает правильный результат. Но мы используем функцию RPAD для размещения большего количества пробелов с $, для одного китайского символа потребовалось 2 байта, а не 3 байта. Поэтому, когда я набираю 10 байтов, он заполнил мне 4 знака.
Мой вопрос: почему функция RPAD не следует так, как lengthb?
Согласно [Oracle] (док http://docs.oracle.com/cd /B28359_01/server.111/b28286/functions147.htm#SQLRF06103), он должен вернуть «甲骨文 $$$$$$$»: Аргумент n - это общая длина возвращаемого значения, отображаемая на экране вашего терминала. вы получаете какую-либо разницу, если пытаетесь «RPAD (CAST (« 甲骨文 »AS NVARCHAR2 (10)), 10, '$'), RPAD (CAST ('甲骨文' AS VARCHAR2 (10)), 10, '$'), '? –
Это не относится к «甲骨文 $$$$$$$», потому что AL32UTF8 - это набор символов MULTI-BYTES. Метод, который вы предоставили, возвращает те же результаты, что и выше. – eliuhy
Что делать, если вы помещаете явное «N» перед буквальным: N '甲骨文' – Morbo