我有一个包含列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'
我可以看到一个大小为2048的CHAR_LENGTH列,但除此之外我没有跟踪为什么它会自行抢占?
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)
...
)
但我仍然不知道如何调整这个数字? 它是否有助于使用简单的alter table并设置varchar2(3192 CHAR)?
答案 0 :(得分: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);
解决问题。