oracle varchar max ниже указанного

У меня есть таблица со столбцом varchar2 (4000), где у меня возникла проблема с вставкой данных, например:

ORA-12899: value too large for column "XXX"."YYY"."ZZZ" (actual: 2132, maximum: 2048) 

Когда я бегу

select * from user_tab_columns where table_name = 'YYY'

Я вижу столбец CHAR_LENGTH размером 2048, но кроме этого у меня нет никаких следов, почему он будет вытесняться сам?

CHARACTER_SET_NAME - это CHAR_CS, но содержимое в основном закодировано в base64 .. Есть какие-нибудь подсказки, как решить эту проблему?

С Уважением

Обновление:

Вот полные user_tab_columns, извините за отступ.

TABLE_NAME  COLUMN_NAME DATA_TYPE   DATA_TYPE_MOD   DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION  DATA_SCALE  NULLABLE    COLUMN_ID   DEFAULT_LENGTH  DATA_DEFAULT    NUM_DISTINCT    LOW_VALUE   HIGH_VALUE  DENSITY NUM_NULLS   NUM_BUCKETS LAST_ANALYZED   SAMPLE_SIZE CHARACTER_SET_NAME  CHAR_COL_DECL_LENGTH    GLOBAL_STATS    USER_STATS  AVG_COL_LEN CHAR_LENGTH CHAR_USED   V80_FMT_IMAGE   DATA_UPGRADED   HISTOGRAM
YYY ZZZ VARCHAR2    <null>  <null>  4,000   <null>  <null>  Y   7   <null>  <null>  15  41  42  43  44  45  46  47      4d  49  49  46  75  7a  43  43  42  4b  4f  67  41  77  49  42  41  67  49  45  54  41  4c  4d  68  6a  41  4e  42  67  6b  71      0.06667 662 1   2013-06-03  929 CHAR_CS 4,000   NO  NO  1,394   2,048   C   NO  YES NONE

Отметка 2048 берется из столбца CHAR_LENGTH, а CHAR_USED - это C ..

Обновление: удалось получить исходный DDL

CREATE TABLE "XXX", "YYY"
(
  ...
  "ZZZ" VARCHAR2 (2048 CHAR)
  ...
)

Но я до сих пор не знаю, как отрегулировать эту цифру? Помогло бы это с простой таблицей изменения и установкой varchar2 (3192 CHAR)?


person Niels Bech Nielsen    schedule 04.06.2013    source источник
comment
Как вы думаете, почему это varchar2(4000) - поддерживает ли это тип данных и длина данных из user_tab_columns? Можете ли вы опубликовать команду создания таблицы (желательно из dbms_metadata.get_ddl, если она не была построена так, как вы думаете)?   -  person Alex Poole    schedule 04.06.2013
comment
из user_tab_columns ..   -  person Niels Bech Nielsen    schedule 04.06.2013
comment
См. Обновление выше. Не знаю, как добраться до dbms_metadata.get_ddl, поэтому могу только предположить, что это был исходный sql, который был базовым: ZZZ VARCHAR2 (4000)   -  person Niels Bech Nielsen    schedule 04.06.2013
comment
Какой у вас набор символов в базе данных?   -  person a_horse_with_no_name    schedule 04.06.2013
comment
из nls_database_parameters .... NLS_CHARACTERSET = AL32UTF8, NLS_NCHAR_CHARACTERSET = UTF8, NLS_LENGTH_SEMANTICS = BYTE, NLS_NCHAR_CONV_EXCP = FALSE   -  person Niels Bech Nielsen    schedule 04.06.2013
comment
Странная проблема. Используйте это, чтобы получить определение таблицы: select dbms_metadata.get_ddl('TABLE', 'YYY', 'XXX') from dual;   -  person Jon Heller    schedule 05.06.2013
comment
Это может быть вызвано внутренним преобразованием входящих данных ... Вы уверены, что обе кодировки одинаковы?   -  person i100    schedule 06.06.2013


Ответы (1)


Ваш столбец ограничен как 2048 символами, так и 4000 байтами. Независимо от семантики длины вашего символа, ALL_TAB_COLUMNS.DATA_LENGTH - «Длина столбца (в байтах)». AL32UTF8 может использовать до 4 байтов на символ, поэтому DATA_LENGTH будет числом символов * 4. За исключением того, что оно никогда не будет больше предела Oracle, равного 4000.

Например:

create table test1(a varchar2(1 char));
create table test2(a varchar2(2 char));
create table test3(a varchar2(1000 char));
create table test4(a varchar2(4000 char));

select table_name, data_length
from all_tab_columns
where table_name like 'TEST_';

TABLE_NAME   DATA_LENGTH
----------   -----------
TEST1        4
TEST2        8
TEST3        4000
TEST4        4000

Вы можете решить свою проблему с помощью alter table xxx.yyy modify zzz varchar2(4000 char);.

person Jon Heller    schedule 06.06.2013