【问题标题】:oracle varchar max lower than specifiedoracle varchar max 低于指定值
【发布时间】:2013-06-07 02:08:18
【问题描述】:

我有一个包含 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) 有帮助吗?

【问题讨论】:

  • 为什么你认为它是varchar2(4000) - 来自user_tab_columns 的数据类型和数据长度是否支持?你能发布表创建命令吗(最好来自dbms_metadata.get_ddl,以防它不是你想的那样构建的)?
  • 来自 user_tab_columns..
  • 见上面的更新。不知道如何获取dbms_metadata.get_ddl,所以只能假设它是原始sql,这是一个基本的:ZZZ VARCHAR2(4000)
  • 你的数据库字符集是什么?
  • 来自 nls_database_parameters.... NLS_CHARACTERSET=AL32UTF8, NLS_NCHAR_CHARACTERSET=UTF8, NLS_LENGTH_SEMANTICS=BYTE, NLS_NCHAR_CONV_EXCP=FALSE

标签: oracle oracle10g varchar2


【解决方案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); 解决您的问题。

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 2011-02-11
    • 2010-09-29
    • 2010-09-24
    • 2015-05-12
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多