2013-06-04 3 views
1

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

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

При запуске

select * from user_tab_columns where table_name = 'YYY' 

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

CHARACTER_SET_NAME - CHAR_CS, но контент в основном кодируется base64. Любые подсказки, как преодолеть эту проблему?

С уважением

Update:

Вот полные 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 ..

Update: удалось получить начальную DDL

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

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

+2

Почему вы думаете, что это 'varchar2 (4000)' - поддерживает ли тип данных и длину данных из 'user_tab_columns'? Можете ли вы опубликовать команду создания таблицы (желательно из 'dbms_metadata.get_ddl', если она не была построена так, как вы думаете)? –

+0

from user_tab_columns .. –

+0

См. Обновление выше. Не знаю, как добраться до dbms_metadata.get_ddl, поэтому можно только предположить, что это был оригинальный sql, который был базовым: ZZZ VARCHAR2 (4000) –

ответ

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);.