1

我有一个包含 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)
  ...
)

但我仍然不知道如何调整这个数字?对简单的更改表和设置 varchar2(3192 CHAR) 有帮助吗?

4

1 回答 1

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

于 2013-06-06T18:08:18.747 回答