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

4000 32000 (с копейками) или не ограничена
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32457466
Фотография Serega128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esli sozdaesh pole v tablice - to 4000, a esli peremennaya - 32767.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32457475
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при этом насколько я помню БАЙТ.
В случае, если кодировка UTF8, длина в символах - меньше.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32457493
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максимальная длина varchar-поля всегда 4000, и в байтах, и в символах:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
dan@sqlmast>; col name format a30
dan@sqlmast>; col value$ format a30
dan@sqlmast>; select name, value$ from sys.props$ where name = 'NLS_CHARACTERSET';

NAME                           VALUE$
 ------------------------------ ------------------------------
 
NLS_CHARACTERSET               UTF8

dan@sqlmast>; create table test (
   2       b varchar2( 4000  byte)
   3     , c varchar2( 4000  char)
   4   );

Table created.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32457552
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно все же в вопросе с UTF8 прийти к согласию. Честно скажу, с UTF8 я не игрался. Но в доке по 8.1.5 сказано:

Oracle8i Application Developer's Guide - Fundamentals
Release 8.1.5
A68003-01
4.Selecting a Datatype

VARCHAR2 (size)
Variable-length character data
Variable for each row, up to 4000 bytes per row: Consider the character set (one-byte or multibyte) before setting size: A maximum size must be specified.

и далее про NVARCHAR2

NVARCHAR2 (size)
Variable-length character data of length size characters or bytes, depending on national character set: A maximum size must be specified
Variable for each row. Column size is the number of characters for a fixed-width national character set or the number of bytes for a varying-width national character set. Maximum size is determined by the number of bytes required to store one character, with an upper limit of 4000 bytes per row. Default is 1 character or 1 byte, depending on the character set.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32457962
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тест с UTF8 ни очем не говорит.
Символы в этой кодировке имеют переменную длину 1-2б.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32458070
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"В военное время значение синуса может достигать четырех":)

Oracle9i Database Globalization Support Guide
Supporting Multilingual Databases with Unicode
What is Unicode?
Unicode Encodings
UTF-8 Encoding
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96529/ch5.htm#1004835

One Unicode character can be 1 byte, 2 bytes, 3 bytes, or 4 bytes in UTF-8 encoding.

Причем в поле VARCHAR2(4000 char) "помещается" именно 4000 символа, е не байтов:
Код: plaintext
1.
2.
create table test (c varchar2( 4000  char));
insert into test(c) values (lpad('Ф',  4000 , 'Ф'));


'Ф' для UTF8 - это 2 байта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
dan@sqlmast>; select length('Ф') l
   2        , lengthb('Ф') lb
   3        , lengthb(lpad('Ф',  4000 , 'Ф')) lbf
   4   from dual;

         L         LB        LBF
 ---------- ---------- ----------
 
          1            2         4000 


Мне, правда, не совсем понятно, почему LENGTHB(LPAD('Ф', 4000, 'Ф')) показывает 4000. И что показывает поле USER_TAB_COLUMNS.DATA_LENGTH:

Код: plaintext
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.
dan@sqlmast>; create table test (
   2       b varchar2( 4000  byte)
   3     , c varchar2( 4000  char)
   4     , d varchar2( 1000  char)
   5     , e varchar2( 1333  char)
   6     , f varchar2( 2000  char)
   7   );                       

Table created.

dan@sqlmast>; col table_name format a10
dan@sqlmast>; col column_name format a15
dan@sqlmast>; col data_type format a15
dan@sqlmast>; col char_used format a10
dan@sqlmast>; select table_name, column_name, data_type
   2        , data_length, char_used, char_col_decl_length, char_length 
   3   from cols 
   4   where table_name = 'TEST';

TABLE_NAME COLUMN_NAME     DATA_TYPE       DATA_LENGTH CHAR_USED  CHAR_COL_DECL_LENGTH CHAR_LENGTH
 ---------- --------------- --------------- ----------- ---------- -------------------- -----------
 
TEST       B               VARCHAR2                4000  B                           4000          4000 
TEST       C               VARCHAR2                4000  C                           4000          4000 
TEST       D               VARCHAR2                3000  C                           3000          1000 
TEST       E               VARCHAR2                3999  C                           3999          1333 
TEST       F               VARCHAR2                4000  C                           4000          2000 


Вот если длина поля заявляется в символах, то после VARCHAR2(1333 char) DATA_LENGTH принимает значение 4000.

C NVARCHAR'ом я пока не работал, хотя, если не ошбаюсь, есть юникодные кодировки как и с фиксированной длиной символа, так и с плавающей?
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32458135
max(id)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Oracle есть понятие "семантика длины символьных данных", может быть битовая семантика и символьная. Функция LENGTHB() возвращает длину строки в в еденицах выбранной семантики. Поэтому и получаем 4000, но прошу заметить это байты т.к. при создании таблицы по умолчанию используется битовая семантика для столбцов типа VARCHAR2 и VARCHAR.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32458166
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, почему тогда получается следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
dan@sqlmast>; select lengthb('Ф') lb, lengthb(lpad('Ф',  1 )) lbp from dual;

        LB        LBP
 ---------- ----------
 
          2            1 
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32458201
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, с трудом верится что можно записать
4000 бухбайтных символов

Если не трудно то
begin
for i in 1..5000 loop
update test set v=v||'Ф';
end loop;
end;
/
на чем слетит

ЗЫ
Как версия lpad работает побайтно,
поробуйте для 'Ф' нечетное число (напр 3),
что получим?
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32458212
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в sql 4000 символов
в plsql 32000 с чем то
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32458253
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух ты! Действительно выходит, что я ошибаюсь:

Код: plaintext
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.
dan@sqlmast>; create table test (
   2       c varchar2( 4000  char)
   3     , counter number( 5 )
   4   );

Table created.

dan@sqlmast>; begin
   2     delete test;
   3     insert into test (c, counter) values ('Ф',  1 );
   4     commit;
   5     for i in  1 .. 5000  loop
   6       update test set
   7           c = c||'Ф'
   8         , counter = counter +  1 ;
   9       commit;
  10     end loop;
  11   end;
  12   /
begin
*
ERROR at line  1 :
ORA- 01489 : result of string concatenation is too long
ORA- 06512 : at line  6 


dan@sqlmast>; select counter from test;

   COUNTER
 ----------
 
       2000 


Опять наткнулся на неявное обрезание строки. Но заметил так же, что если подобным же образом наращивать строку английскими символами, но проиходит то же самое, что и, собственно, ожидалось. Итого:

1. В поле таблицы не может быть записано VARCHAR-значение размером больше 4000 байт.
2. VARCHAR2(4000 char) следут читать не как "4000 символов", а "4000 байт с фиксированной длиной каждого символа". Остается только выяснить, почему в представлении USER_TAB_COLUMNS DATA_LENGTH = CHAR_LENGTH * 3, а не на 4, хотя вроде как в UTF8 существуют символы длиной в 4 байта.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #32458441
max(id)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотелось бы услышать мнения, почему так произошло с lpad-ом или это просто опечатка какаято?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
И какая же всетаки длинна VARCHAR2
    #39174584
savell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема старая, но не раскрыта полностью:

Максимальная длина поля varchar2 = 4000 байт для SQL и 32767 для PLSQL
Если используется многобайтная кодировка, то масимальное значение в символах расчитывается из сумм длинн в байтах каждого символа строки.

Код: xml
1.
Мне, правда, не совсем понятно, почему LENGTHB(LPAD('Ф', 4000, 'Ф')) показывает 4000


Потому что lpad/rpad перменную varchar2 всегда обсчитывает в байтах, а nvarchar2 в символах

Код: plsql
1.
2.
select length(rpad('яяя',50,'-')) as aaa,length(rpad(n''||'яяя',50,'-')) as bbb,lengthb(rpad(n''||'яяя',50,'-')) as ccc,lengthb(rpad('яяя',50,'-')) as ddd
from dual


Код: plaintext
1.
2.
       AAA        BBB        CCC        DDD
---------- ---------- ---------- ----------
        47         50        100         50


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table t_test_varchar (counter number(5));
declare 
l varchar2(32676);
begin
    execute immediate 'truncate table t_test_varchar';
    insert into t_test_varchar values (0);
    for i in 1..32676 loop
    update t_test_varchar set counter=i;
    commit;
       if(i<10000) then l:=l||'F'; else  l:=l||'Ф'; end if;
    end loop;
end;
/
Error at line 1
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 9

select * from t_test_varchar
   COUNTER
----------
     21384



Код: plsql
1.
select length('Ф') l , lengthb('Ф') lb , length(lpad(cast('5' as varchar2(1) ), 100000000, '5')) lmax, lengthb(lpad(cast('5' as varchar2 (1) ), 100000000, 'Ф')) lmaxb , length(lpad(cast('Ф' as nvarchar2(1) ), 100000000, 'Ф')) lmaxN, lengthb(lpad(cast('Ф' as nvarchar2 (1) ), 100000000, 'Ф')) lmaxbN from dual;



Код: plaintext
1.
2.
         L         LB       LMAX      LMAXB      LMAXN     LMAXBN
---------- ---------- ---------- ---------- ---------- ----------
         1          2       4000       4000       2000       4000
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174601
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savell,

Специально зарегился чтоб написать эту ерунду?

Уже пару лет как с выходом 12с ограничения изменились, но, вероятно, тебе понадобится еще 10 лет чтоб об этом написать.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174605
savellЕсли используется многобайтная кодировка, то масимальное значение в символах расчитывается из сумм длинн в байтах каждого символа строки.А если однобайтная, то по другому. Да и формулировочка корректнее звучала бы наоборот - кто на ком максимальный. Так что на полноту раскрытия опять не претендует.
И неблагодарное это... Если кто-то не освоил документацию, то и поиск освоить ему будет влом, а, если и забредет на тему, еще шесть раз разжевывать придется. Семь раз разжуй... и выплюнь.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174611
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savellПотому что lpad/rpad перменную varchar2 всегда обсчитывает в байтах, а nvarchar2 в символахНеверно.
savellЕсли используется многобайтная кодировка
Код: plaintext
1.
2.
       AAA        BBB        CCC        DDD
---------- ---------- ---------- ----------
        47         50        100         50
Фэйк.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174639
savell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,
Зарегился специально, но не только для этого. Буду писать много подобного потому как в документации с первого-второго-третьего раза понять не всегда возможно.

Все примеры-реальные на базе 12.1 с январским патчСетом и кодировкой Al32utf8
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174653
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savellБуду писать много подобного потому как в документации с первого-второго-третьего раза понять не всегда возможно.Значит будем ставить на место соответственно самоуверенному невежеству.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174676
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savellВсе примеры-реальные на базе 12.1 с январским патчСетом и кодировкой Al32utf8
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> select VALUE from nls_database_parameters where parameter='NLS_CHARACTERSET';

VALUE
--------------------------------------------------------------------------------
AL32UTF8

SQL> select length(rpad('яяя',50,'-')) as aaa,length(rpad(n''||'яяя',50,'-')) as bbb,lengthb(rpad(n''||'яяя',50,'-')) as ccc,lengthb(rpad('яяя',50,'-')) as ddd
  2  from dual;

       AAA        BBB        CCC        DDD
---------- ---------- ---------- ----------
        50         50        100         53
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174698
savell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--,

Теперь я совсем запутался.
Я залез в эту ветку, потому что мне надо было выгрузить строку с полями фиксированной ширины. И rpad с русскими буквами в поле varchar2 добавлял меньшее колтчество "заполнителей" пока я явно не преобразовал донные в nvarchar.

Возможно, что это из-за nls_lang=cl8mswin1251? Завтра ещё поэкспериментирую.

P.S. то, что я написал - это не Фэйк.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174748
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savellвыгрузить строку с полями фиксированной шириныimho, приводить строки к единой длине правильнее было бы на клиенте, который "выгружает".
то, что я написал - это не Фэйк.для правдоподобности приводи копипасты из sqlplus.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174832
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по сути длины в символах у varchar2 вообще нет.
Даже если она указывается в символах, нет гарантии, что указанное число символов туда влезет.
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39174999
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivпо сути длины в символах у varchar2 вообще нет.
Даже если она указывается в символах, нет гарантии, что указанное число символов туда влезет.
а не надо вблизи лимитов ошиваться - и будут вам гарантии
...
Рейтинг: 0 / 0
И какая же всетаки длинна VARCHAR2
    #39175235
savell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--,

OFF TOPIC: касательно RPAD / LPAD на UTF-8 Oracle 12.1

На 11.2 у меня rpad тоже работает нормально, а вот на 12.1 - врёт

Код: 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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
[oracle@xxxxx ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
[oracle@xxxxx ~]$ env|grep LANG
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LANG=en_US.UTF-8
[oracle@xxxxx ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 19 13:04:22 2016

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select VALUE from nls_database_parameters where parameter='NLS_CHARACTERSET'
union select VALUE from nls_session_parameters where parameter='NLS_LENGTH_SEMANTICS' ;

VALUE
--------------------------------------------------------------------------------
AL32UTF8
CHAR

SQL> SET LINESIZE 32000;
SQL> select lengthc(rpad('я',5,'-')) as aaa
,lengthc(rpad(convert(chr(223),'AL32UTF8','CL8MSWIN1251'),5,'-')) as bbb
,lengthc(rpad(n''||convert(chr(223),'AL32UTF8','CL8MSWIN1251'),5,'-')) as ccc
,dump('я'),dump(rpad('я',5,'-'))
,dump(convert(chr(255),'AL32UTF8','CL8MSWIN1251')) as dump_fromChar
,dump(rpad(convert(chr(255),'AL32UTF8','CL8MSWIN1251'),5,'-')) as dump_RPadfromChar from dual;

       AAA        BBB        CCC DUMP('Я')                  DUMP(RPAD('Я',5,'-'))                 DUMP_FROMCHAR          DUMP_RPADFROMCHAR
---------- ---------- ---------- -------------------------- ------------------------------------- ---------------------- ----------------------------------------
         5          5          5 Typ=96 Len=2: 209,143      Typ=1 Len=6: 209,143,45,45,45,45      Typ=1 Len=2: 209,143   Typ=1 Len=6: 209,143,45,45,45,45

SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@xxxxx ~]$ . /etc/profile
[oracle@xxxxx ~]$ env|grep LANG
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LANG=en_US.UTF-8
[oracle@xxxxx ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 12.1.0.2.0 Production on Fri Feb 19 13:06:00 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 VALUE from nls_database_parameters where parameter='NLS_CHARACTERSET' union select VALUE from nls_session_parameters where parameter='NLS_LENGTH_SEMANTICS' ;

VALUE
--------------------------------------------------------------------------------
AL32UTF8
CHAR


SQL> SET LINESIZE 32000;
SQL> select lengthc(rpad('я',5,'-')) as aaa
,lengthc(rpad(convert(chr(223),'AL32UTF8','CL8MSWIN1251'),5,'-')) as bbb
,lengthc(rpad(n''||convert(chr(223),'AL32UTF8','CL8MSWIN1251'),5,'-')) as ccc
,dump('я')
,dump(rpad('я',5,'-'))
,dump(convert(chr(255),'AL32UTF8','CL8MSWIN1251')) as dump_fromChar
,dump(rpad(convert(chr(255),'AL32UTF8','CL8MSWIN1251'),5,'-')) as dump_RPadfromChar from dual;

       AAA        BBB        CCC DUMP('Я')                 DUMP(RPAD('Я',5,'-'))          DUMP_FROMCHAR            DUMP_RPADFROMCHAR
---------- ---------- ---------- ------------------------- ------------------------------ ------------------------ ----------------------------------
         4          4          5 Typ=96 Len=2: 209,143     Typ=1 Len=5: 209,143,45,45,45  Typ=1 Len=2: 209,143     Typ=1 Len=5: 209,143,45,45,45

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


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