2013-11-27 3 views
6

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?

+0

Согласно [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, '$'), '? –

+0

Это не относится к «甲骨文 $$$$$$$», потому что AL32UTF8 - это набор символов MULTI-BYTES. Метод, который вы предоставили, возвращает те же результаты, что и выше. – eliuhy

+0

Что делать, если вы помещаете явное «N» перед буквальным: N '甲骨文' – Morbo

ответ

1

Как запрос @jonearles, я скопировал свое решение в разделе комментариев в виде единого ответа здесь, чтобы помочь людям решить эту проблему.

Привет, ребята, у меня есть причина и обходные пути при поиске в Google. Вот объяснение из документации Oracle: «Общая длина возвращаемого значения, как она отображается на экране терминала. В большинстве наборов символов это также количество символов в возвращаемом значении. Однако в некоторых многобайтовых наборах символов, длина отображения символьной строки может отличаться от количества символов в строке. " И обходные пути зависит от фактической длины дисплея в экране (Просмотр текста в моноширинных шрифтов)

Обходные

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

Это ошибка Oracle. Причиной ошибки является: Каждый $ - один байт, но каждый китайский символ - 3 байта. Когда RPAD в этой версии работает, он просто вычисляет 3 китайских + 10 $ 's = 13 байт. Когда он отображает 13 байт - он должен сократить некоторые $. Вы можете открыть ошибку с Oracle.

Смежные вопросы