powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / И какая же всетаки длинна VARCHAR2
25 сообщений из 53, страница 2 из 3
И какая же всетаки длинна VARCHAR2
    #39175250
utl_i18n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
savell,

lengthc применима специфично к ucs, который отнюдь не utf-8, который ты ему передаешь. чем тебя не устраивает length без суффиксов? convert вообще корявая функция, забудь про нее навсегда.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39175280
savell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
utl_i18nsavell,

lengthc применима специфично к ucs, который отнюдь не utf-8, который ты ему передаешь. чем тебя не устраивает length без суффиксов? convert вообще корявая функция, забудь про нее навсегда.

Length() ведёт себя точно также, собственно в дампе видно истинную длину получившегося выражения. Суть в том, что lpad некорректно возваращает строку: у меня кодировка везде UTF-8, в доке написано что The total length of the return value as it is displayed on your terminal screen. In most character sets, this is also the number of characters in the return value. However, in some multibyte character sets, the display length of a character string can differ from the number of characters in the string.

Я хочу на терминале увидеть поле длиной 5 символов, а он мне возвращает меньше, 5 байт.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
[oracle@xxxxx ~]$ env|grep LANG
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LANG=en_US.UTF-8
[oracle@xxxxx ~]$ sqlplus "/as sysdba"
$ sqlplus "/as sysdba"

SQL*Plus: Release 12.1.0.2.0 Production on Fri Feb 19 13:46:23 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select rpad('яя',5,'=') as aaa,rpad(n''||'яя',5,'=') as ccc from dual;

AAA          CCC
------------ --------------------
яя=          яя===
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
И какая же всетаки длинна VARCHAR2
    #39525972
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savellЯ хочу на терминале увидеть поле длиной 5 символов, а он мне возвращает меньше, 5 байт.Я и нарвался на эту неприятную особенность.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
column parameter format a30
column value     format a30

select *
from nls_database_parameters
where parameter in ('NLS_RDBMS_VERSION', 'NLS_LENGTH_SEMANTICS', 'NLS_CHARACTERSET');

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_RDBMS_VERSION              12.1.0.2.0
NLS_LENGTH_SEMANTICS           BYTE
NLS_CHARACTERSET               AL32UTF8


show parameter max_string_size;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      STANDARD

column name      format a15
column rpad_name format a25

with s (name) as
(select 'Привет'       from dual union all
 select 'Привет мир'   from dual union all
 select 'Hello'        from dual union all
 select 'Hello world'  from dual
)
select t.*, length(rpad_name) rpad_name_len, lengthb(rpad_name) rpad_name_lenb
from
   (select name, length(name) len, rpad(name, 20, '+') rpad_name
    from s
   ) t;

NAME                   LEN RPAD_NAME                 RPAD_NAME_LEN RPAD_NAME_LENB
--------------- ---------- ------------------------- ------------- --------------
Привет                   6 Привет++++++++                       14             20
Привет мир              10 Привет мир+                          11             20
Hello                    5 Hello+++++++++++++++                 20             20
Hello world             11 Hello world+++++++++                 20             20
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39525993
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Код: plsql
1.
where parameter in ('NLS_RDBMS_VERSION', 'NLS_LENGTH_SEMANTICS', 'NLS_CHARACTERSET');

А остальные? И *session*?
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39525998
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Завтра доберусь до станка, скину.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526140
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

NLS Params
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
column parameter format a30
column value     format a30

select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_RDBMS_VERSION              12.1.0.2.0
NLS_NCHAR_CONV_EXCP            FALSE
NLS_LENGTH_SEMANTICS           BYTE
NLS_COMP                       BINARY
NLS_DUAL_CURRENCY              $
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_SORT                       BINARY
NLS_DATE_LANGUAGE              AMERICAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_CALENDAR                   GREGORIAN
NLS_NUMERIC_CHARACTERS         .,
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_CHARACTERSET               AL32UTF8
NLS_ISO_CURRENCY               AMERICA
NLS_CURRENCY                   $
NLS_TERRITORY                  AMERICA
NLS_LANGUAGE                   AMERICAN

20 строк выбрано.


select * from nls_session_parameters;

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_LANGUAGE                   RUSSIAN
NLS_TERRITORY                  RUSSIA
NLS_CURRENCY                   р.
NLS_ISO_CURRENCY               RUSSIA
NLS_NUMERIC_CHARACTERS         ,
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                yyyy-mm-dd hh24:mi:ss
NLS_DATE_LANGUAGE              RUSSIAN
NLS_SORT                       RUSSIAN
NLS_TIME_FORMAT                HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT           DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT        DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY              р.
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE

17 строк выбрано.

...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526145
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Код: plsql
1.
NLS_LENGTH_SEMANTICS           BYTE

А если CHAR?
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526152
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Без изменений
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
column parameter format a30
column value     format a30

alter session set nls_length_semantics = char;

Сеанс изменен.


select *
from nls_session_parameters
where parameter = 'NLS_LENGTH_SEMANTICS';

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_LENGTH_SEMANTICS           CHAR


with s (name) as
(select 'Привет'       from dual union all
 select 'Привет мир'   from dual union all
 select 'Hello'        from dual union all
 select 'Hello world'  from dual
)
select t.*, length(rpad_name) rpad_name_len, lengthb(rpad_name) rpad_name_lenb
from
   (select name, length(name) len, rpad(name, 20, '+') rpad_name
    from s
   ) t;

NAME               LEN RPAD_NAME            RPAD_NAME_LEN RPAD_NAME_LENB
----------- ---------- -------------------- ------------- --------------
Привет               6 Привет++++++++                  14             20
Привет мир          10 Привет мир+                     11             20
Hello                5 Hello+++++++++++++++            20             20
Hello world         11 Hello world+++++++++            20             20
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526224
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Код: plsql
1.
select * from nls_database_parameters;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
PARAMETER	VALUE
NLS_RDBMS_VERSION	12.2.0.1.0
NLS_NCHAR_CONV_EXCP	FALSE
NLS_LENGTH_SEMANTICS	BYTE
NLS_COMP	BINARY
NLS_DUAL_CURRENCY	$
NLS_TIMESTAMP_TZ_FORMAT	DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT	HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT	DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT	HH.MI.SSXFF AM
NLS_SORT	BINARY
NLS_DATE_LANGUAGE	AMERICAN
NLS_DATE_FORMAT	DD-MON-RR
NLS_CALENDAR	GREGORIAN
NLS_NUMERIC_CHARACTERS	.,
NLS_NCHAR_CHARACTERSET	AL16UTF16
NLS_CHARACTERSET	AL32UTF8
NLS_ISO_CURRENCY	AMERICA
NLS_CURRENCY	$
NLS_TERRITORY	AMERICA
NLS_LANGUAGE	AMERICAN



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with s (name) as
(select 'Привет'       from dual union all
 select 'Привет мир'   from dual union all
 select 'Hello'        from dual union all
 select 'Hello world'  from dual
)
select t.*, length(rpad_name) rpad_name_len, lengthb(rpad_name) rpad_name_lenb
from
   (select name, length(name) len, rpad(name, 20, '+') rpad_name
    from s
   ) t;



Код: plsql
1.
2.
3.
4.
5.
NAME	LEN	RPAD_NAME	RPAD_NAME_LEN	RPAD_NAME_LENB
Привет           6	Привет++++++++++++++	20	26
Привет мир	10	Привет мир++++++++++	20	29
Hello	         5	Hello+++++++++++++++	20	20
Hello world	11	Hello world+++++++++	20	20

...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526234
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из того, что бросается в глаза - разница в версии. Видать, пофиксили уже.
MaximaXXL
Код: plsql
1.
NLS_RDBMS_VERSION	12.2.0.1.0
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526235
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Код: plsql
1.
select * from nls_session_parameters;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
PARAMETER	        VALUE
NLS_LANGUAGE   	        AMERICAN
NLS_TERRITORY	        AMERICA
NLS_CURRENCY	        $
NLS_ISO_CURRENCY	AMERICA
NLS_NUMERIC_CHARACTERS	.,
NLS_CALENDAR	        GREGORIAN
NLS_DATE_FORMAT  	DD-MON-RR
NLS_DATE_LANGUAGE	AMERICAN
NLS_SORT	        BINARY
NLS_TIME_FORMAT	        HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT	DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT	HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT	DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY	$
NLS_COMP	        BINARY
NLS_LENGTH_SEMANTICS	BYTE
NLS_NCHAR_CONV_EXCP	FALSE
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526239
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadБез измененийСмахивает на баг именно в 12.1. На 11.2 и 12.2 всё работает ожидаемо.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Elic@ELIC122UTF8>; with s (name) as
Elic@ELIC122UTF8>; (select 'Привет'       from dual union all
Elic@ELIC122UTF8>;  select 'Привет мир'   from dual union all
Elic@ELIC122UTF8>;  select 'Hello'        from dual union all
Elic@ELIC122UTF8>;  select 'Hello world'  from dual
Elic@ELIC122UTF8>; )
Elic@ELIC122UTF8>; select t.*, length(rpad_name) rpad_name_len, lengthb(rpad_name) rpad_name_lenb
Elic@ELIC122UTF8>; from
Elic@ELIC122UTF8>;    (select name, length(name) len, rpad(name, 20, '+') rpad_name
Elic@ELIC122UTF8>;     from s
Elic@ELIC122UTF8>;    ) t;

NAME                          LEN RPAD_NAME                                                                        RPAD_NAME_LEN RPAD_NAME_LENB
------------------- ------------- -------------------------------------------------------------------------------- ------------- --------------
Привет                          6 Привет++++++++++++++                                                                        20             26
Привет мир                     10 Привет мир++++++++++                                                                        20             29
Hello                           5 Hello+++++++++++++++                                                                        20             20
Hello world                    11 Hello world+++++++++                                                                        20             20

Elic@ELIC122UTF8>; exec execute immediate 'alter session set nls_length_semantics = char'

PL/SQL procedure successfully completed.

Elic@ELIC122UTF8>; /

NAME                  LEN RPAD_NAME            RPAD_NAME_LEN RPAD_NAME_LENB
----------- ------------- -------------------- ------------- --------------
Привет                  6 Привет++++++++++++++            20             26
Привет мир             10 Привет мир++++++++++            20             29
Hello                   5 Hello+++++++++++++++            20             20
Hello world            11 Hello world+++++++++            20             20

Elic@ELIC122UTF8>; select *
Elic@ELIC122UTF8>; from nls_database_parameters
Elic@ELIC122UTF8>; where parameter in ('NLS_RDBMS_VERSION', 'NLS_LENGTH_SEMANTICS', 'NLS_CHARACTERSET');

PARAMETER                                                                                                                        VALUE
-------------------------------------------------------------------------------------------------------------------------------- ---------------
NLS_RDBMS_VERSION                                                                                                                12.2.0.1.0
NLS_LENGTH_SEMANTICS                                                                                                             BYTE
NLS_CHARACTERSET                                                                                                                 AL32UTF8

Elic@ELIC122UTF8>; 

...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526240
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
ты русским языком скажи - о чем плачешь?
Ты чего ждешь, что длина в байтах и символах для русских букв одинаковой окажется для
NLS_CHARACTERSET = AL32UTF8 - не жди не окажется.
Или что у пробела байтовая длина вдруг прыгнет до двух байтов - не жди, не прыгнет в этой кодировке.
О чем плач?
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526242
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nickТест с UTF8 ни очем не говорит.
Символы в этой кодировке имеют переменную длину 1-2б.

Бывают и три :) https://unicode-table.com/ru/2116/
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526245
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyО чем плач?Не выполняется задокументированное (=гарантированное лоцией) "padded to length n characters "
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526246
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
а, понял про rpad и семантику при отсутствии явных определений - извини.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526248
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyAmKad,
ты русским языком скажи - о чем плачешь?
Ты чего ждешь, что длина в байтах и символах для русских букв одинаковой окажется для
NLS_CHARACTERSET = AL32UTF8 - не жди не окажется.
Или что у пробела байтовая длина вдруг прыгнет до двух байтов - не жди, не прыгнет в этой кодировке.
О чем плач?
Тяжело, когда уровень не позволяет понять даже простейшие примеры?
И нравится же людям выставлять себя дураками =)
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526276
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|,
и не говори...
выставлять - тщетное занятие.
Все что нужно - само выставится.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526481
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Workaround
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
column name1  format a25
column name2 format a25

with s (name) as
(select 'Привет'       from dual union all
 select 'Привет мир'   from dual union all
 select 'Hello'        from dual union all
 select 'Hello world'  from dual
)
select
rpad(         name , 20, '+') name1,
rpad(to_nchar(name), 20, '+') name2
from s;

NAME1                     NAME2
------------------------- -------------------------
Привет++++++++            Привет++++++++++++++
Привет мир+               Привет мир++++++++++
Hello+++++++++++++++      Hello+++++++++++++++
Hello world+++++++++      Hello world+++++++++
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526498
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadWorkaroundКстати, а как в PL/SQL?
Код: plsql
1.
exec dbms_output.put_line(rpad('Привет мир', 20, '+'))
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526511
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Код: plsql
1.
2.
3.
4.
5.
6.
set serveroutput on

exec dbms_output.put_line(rpad('Привет мир', 20, '+'));
Привет мир+

Процедура PL/SQL успешно завершена.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526536
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Код: plsql
1.
2.
exec dbms_output.put_line(rpad('Привет мир', 20, '+'));
Привет мир+

Печально. Боюсь предположить, что вернёт
Код: plsql
1.
exec dbms_output.put_line(rpad('Привет мир', 16, '+'));
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526561
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Да, обрезает.
Код: plsql
1.
2.
exec dbms_output.put_line(rpad('Привет мир', 16, '+'));
Привет м
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526571
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadДа, обрезает.Выходит, многобайтовый 12cR1 неприменим - не на-workaround-ишься.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39526597
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Перечитал тему. savell пытался донести до сообщества странное поведение rpad-а в ситуации, аналогичной моей, но, похоже, ему это не удалось.
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / И какая же всетаки длинна VARCHAR2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]