#oracle #special-characters
Вопрос:
Я столкнулся с некоторым странным поведением, связанным с RPAD … решил, что упускаю что-то очевидное, надеясь, что кто-нибудь сможет мне помочь.
Я просто пытаюсь отформатировать некоторые простые выходные данные … и свел тестовый случай к очень простому случаю:
set serverout on
declare
lc_wid CONSTANT number := 10;
lc_sep CONSTANT varchar2(10) := ' : ';
lc_NOCOLOR CONSTANT varchar2(100) := chr(27)||'[0m';
lc_RED CONSTANT varchar2(100) := chr(27)||'[32m'||chr(27)||'[1;31m';
lc_GREEN CONSTANT varchar2(100) := chr(27)||'[32m'||chr(27)||'[1;32m';
lc_YELLOW CONSTANT varchar2(100) := chr(27)||'[32m'||chr(27)||'[1;33m';
begin
dbms_output.put_line ( lc_sep || lc_GREEN || 'test' || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || 'test' || lc_sep );
dbms_output.put_line ( lc_sep || lc_GREEN || rpad('test' ,lc_wid,' ') || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || rpad('test' ,lc_wid,' ') || lc_sep );
dbms_output.put_line ( lc_sep || lc_GREEN || rpad('testing' ,lc_wid,' ') || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || rpad('testing' ,lc_wid,' ') || lc_sep );
dbms_output.put_line ( lc_sep || lc_GREEN || rpad('something',lc_wid,' ') || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || rpad('something',lc_wid,' ') || lc_sep );
end;
/
(Да, я балуюсь цветами! весело … )
Это выплевывает следующее:
как вы можете видеть, короткий текст без RPAD выравнивается нормально … и более длинный текст с rpad выравнивается нормально, однако текст «тест» и «тестирование» делают что-то «другое» … О. О.
теперь, если я поменяю rpad на pad с «.» . это работает нормально .
set serverout on
declare
lc_wid CONSTANT number := 10;
lc_sep CONSTANT varchar2(10) := ' : ';
lc_NOCOLOR CONSTANT varchar2(100) := chr(27)||'[0m';
lc_RED CONSTANT varchar2(100) := chr(27)||'[32m'||chr(27)||'[1;31m';
lc_GREEN CONSTANT varchar2(100) := chr(27)||'[32m'||chr(27)||'[1;32m';
lc_YELLOW CONSTANT varchar2(100) := chr(27)||'[32m'||chr(27)||'[1;33m';
begin
dbms_output.put_line ( lc_sep || lc_GREEN || 'test' || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || 'test' || lc_sep );
dbms_output.put_line ( lc_sep || lc_GREEN || rpad('test' ,lc_wid,'.') || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || rpad('test' ,lc_wid,'.') || lc_sep );
dbms_output.put_line ( lc_sep || lc_GREEN || rpad('testing' ,lc_wid,'.') || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || rpad('testing' ,lc_wid,'.') || lc_sep );
dbms_output.put_line ( lc_sep || lc_GREEN || rpad('something',lc_wid,'.') || lc_NOCOLOR || lc_sep );
dbms_output.put_line ( lc_sep || rpad('something',lc_wid,'.') || lc_sep );
end;
/
так… похоже, короткий текст неправильно работает с этими цветовыми кодами И RPAD … но мне интересно, почему ?
Пытаюсь понять, что здесь происходит.
[править] извините, как бы то ни было, я работаю в Oracle 12.1.0.2.0 [/править]
Комментарии:
1. Это может быть больше связано с версией SQLcl, чем с версией Oracle. Он ведет себя должным образом для меня в 20.4. (Хотя это было необходимо
set serveroutput on format wrapped
, чтобы освободить начальное место в первой строке; в противном случае параметры форматирования или вкладка вкл/выкл (что было моей первой догадкой), похоже, не имеют значения.)2. хм, эта мысль приходила мне в голову .. мой клиент sqlplus работает на Linux, v11.2.0.1.0 Я попробовал «завернутый формат», ничего не сделал с этой стороны