Странное поведение с RPAD

#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 Я попробовал «завернутый формат», ничего не сделал с этой стороны